web-dev-qa-db-ja.com

意図的にファイルを排他的にロックする方法

他のユーザーがファイルを読み書きできないように、ファイルに排他ロックをかけたいのです。これを行うための簡単なWindowsツールまたはコマンドはありますか?

ツールまたはユーティリティが LockFileEx Windows関数を実装すると思います。

メモ:メモ帳やメモ帳++などのテキストエディタをテキストファイルで試してみましたが、排他的ロックはかけられていません。

83
John K

Easy File Locker (フリーウェア)を試してください。

enter image description here

22
David

より簡単な解決策:目的のディレクトリでcmd行から実行します。

notepad >filetolock

リダイレクトされた標準出力としては、アプリケーション(メモ帳)が終了するまでロックされたままになります。

"filetolock"はリダイレクトによって上書きされるので、おそらく重要な既存のファイルを使用したくないでしょう。空の "filetolock"はテストしようとしているアプリケーションにとっては重要ではありません。アプリケーションはそれを開くことができないからです。

128
user257114

ファイルをロックする他社製ツールなしでファイルに変更を加えないファイルはコピーできない

このPowerShellスクリプトは、同様の質問に対する回答からの引用です。

もしあなたがそれが役に立つと思うなら、あなたは 元の答え を投票するかもしれませんが、この投稿は支持しないでください。

#Specify the file name
$fileName = "C:\myfile.txt"

#Open the file in read only mode, without sharing (I.e., locked as requested)
$file = [System.io.File]::Open($fileName, 'Open', 'Read', 'None')

#Wait in the above (file locked) state until the user presses a key
Write-Host "Press any key to continue ..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

#Close the file
$file.Close()
31
marsh-wiggle

MS-Excelで開く...このアプリは開いている間ファイルをロックします。

25
Ice

FileLocker はフリーウェア/オープンソースのコマンドラインツールです。

使用法:

FileLocker [/T LockTime] [/I] [/K] [/Q] file [file...]

/T LockTime     Time in milliseconds to lock the file
/I              Infinite locking until process is killed (default)
/K              Lock file until key is pressed
/Q              Be quiet.
11
RRKbabxW3

私はコメントを書くことができないので、私はこのように私の情報を追加します:

https://stackoverflow.com/questions/5860542/how-can-i-simulate-a-locked-file-one-which-has-a-write-lock

編集:他の質問のまとめ:

  • 一時停止コマンド:( >&2 pause ) >> file2lock.txt

  • WordやExcelなどのMSプログラムもロックします(テキストファイルでも動作します)。

  • LOCKFILE_EXCLUSIVE_LOCKおよびLOCKFILE_FAIL_IMMEDIATELYと一緒にプログラム的にLockFileEx(windows API)を使用する

4
Mayra Delgado

これが私がバグテストのためにロックされたファイルのユーザーの振る舞いを再現する方法です。

新しいStreamReaderとしてディム( "C:\ test\sampleFile.txt")

その行を自分のユニットテストに追加してファイルをロックし、次にデバッグモードでテストを実行して、特定のファイルがロックされているときの悪い動作を再現します。

私はまだ私のビジネスユーザーがどのように与えられたファイルをロックしているのか知りません。あなたが言ったように、メモ帳はそれを排他的にロックすることはできません。

幸いなことに、ストリームリーダーを宣言すると、特に指定しない限りファイルは排他的にロックされます。

1
kincaid

私はマーシュウィグルによって2番目の解決策を取ります。これが私のバージョンのスクリプトです。

# This is lock_file.ps1
[CmdletBinding()]
Param(
  [Parameter(Mandatory=$False)]
  [string]$my_file_path
)
if (!$my_file_path){
   Write-Host "Parameter my_file_path is missing, quitting."
   [Environment]::Exit(1)
}
$my_file_exists = Test-Path $my_file_path -pathType Leaf
If ($my_file_exists) {
   #Open the file in read only mode, without sharing (I.e., locked as requested)
   $my_open_file = [System.io.File]::Open($my_file_path, 'Open', 'Read', 'None')
   #Wait in the above (file locked) state until the user presses a key
   Write-Host "Press any key to continue ..."
   $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
   #Close the file
   $my_open_file.Close()
} else {
   Write-Host "Parameter mismatch, file doesn't exist." 
}

このようにcmdから呼び出せます。

powershell -ExecutionPolicy Unrestricted -file lock_file.ps1 "path\to\file_to_lock.txt"
0
Ciove