他の人がファイルを読み書きできないように、ファイルの排他ロックを保持したい。これを行う簡単なWindowsツールまたはコマンドはありますか?
ツールまたはユーティリティがLockFileEx Windows関数を実装すると思います。
注:テキストファイルでNotepadやNotepad ++などのテキストエディターを試しましたが、排他ロックを保持していません。
他の人がファイルを読み書きできないように、ファイルの排他ロックを保持したい。これを行う簡単なWindowsツールまたはコマンドはありますか?
ツールまたはユーティリティがLockFileEx Windows関数を実装すると思います。
注:テキストファイルでNotepadやNotepad ++などのテキストエディターを試しましたが、排他ロックを保持していません。
回答:
Easy File Locker(フリーウェア)をお試しください。
より簡単なソリューション:対象のディレクトリでcmd行から実行します。
notepad >filetolock
リダイレクトされたstdoutとして、アプリケーション(メモ帳)が終了するまでロックされたままになります。
「filetolock」はリダイレクトによって上書きされることに注意してください。したがって、おそらく重要な既存のファイルを使用したくないでしょう。空の「filetolock」は、テストしようとしているアプリケーションにとっては問題になりません。アプリケーションはそれを開くことができないためです。
notepad >>filetolock
ファイルロックサードパーティ製のツールなしに、ファイルに変更はロックされていないされていると、ファイルにもコピーすることはできません
この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()
[void](Read-Host 'Press Enter to continue')
では、$host.UI.RawUI.ReadKey(...)
Powershell ISE の擬似コンソールではReadKeyの代わりにReadKeyがサポートされていません。
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.
コメントを書くことができないので、この方法で情報を追加します。
編集:他の質問の要約:
一時停止コマンド: ( >&2 pause ) >> file2lock.txt
WordやExcelのロックなどのMSプログラムも(テキストファイルに対応)
プログラムでLockFileEx
(windows API)を使用しLOCKFILE_EXCLUSIVE_LOCK
、LOCKFILE_FAIL_IMMEDIATELY
バグテストのために、ロックされたファイルのユーザーの動作を複製する方法を次に示します。
Dim s As New StreamReader( "C:\ test \ sampleFile.txt")
ユニットテストにその行を追加してファイルをロックし、デバッグモードでテストを実行して、特定のファイルがロックされた場合の不正な動作を再現します。
私のビジネスユーザーが特定のファイルをどのようにロックしているかはまだわかりません。あなたが言ったように、メモ帳は排他的にロックすることはできません。
幸いなことに、ストリームリーダーを宣言すると、特に指定しない限りファイルが排他的にロックされます。
2番目のソリューションはmarsh-wiggleです。これが私のバージョンのスクリプトです。
# 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"
「Your-Password-Here」をパスワードに置き換え、このスクリプトをLocker.batとして保存します
*cls
@ECHO OFF
title Folder Locker
if EXIST "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" goto UNLOCK
if NOT EXIST Locker goto MDLOCKER
:CONFIRM
echo Are you sure u want to Lock the folder(Y/N)
set/p "cho=>"
if %cho%==Y goto LOCK
if %cho%==y goto LOCK
if %cho%==n goto END
if %cho%==N goto END
echo Invalid choice.
goto CONFIRM
:LOCK
ren Locker "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
echo Folder locked
goto End
:UNLOCK
echo Enter password to Unlock folder
set/p "pass=>"
if NOT %pass%==Your-Password-Here goto FAIL
attrib -h -s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"
ren "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" Locker
echo Folder Unlocked successfully
goto End
:FAIL
echo Invalid password
goto end
:MDLOCKER
md Locker
echo Locker created successfully
goto End
:End*
バッチファイルを実行すると、「フォルダー(Y / N)をロックしますか?」というプロンプトが表示されます。Yを入力してEnterキーを押すと、フォルダーがロックされます。
バッチファイルを再度実行し、パスワードとフォルダーを入力すると、すべてのファイルが再びロック解除されます。