我不确定人们通常所说的“锁定”文件是什么意思,但我想要的是对一个文件执行此操作,当我尝试使用以下命令打开它时,该文件将产生“指定的文件正在使用”错误消息另一个应用程序。
我想这样做是为了测试我的应用程序,看看当我尝试打开处于这种状态的文件时它的行为如何。我试过这个:
FileStream fs = null;
private void lockToolStripMenuItem_Click(object sender, EventArgs e)
{
fs = new FileStream(@"C:\Users\Juan Luis\Desktop\corte.txt", FileMode.Open);
}
private void unlockToolStripMenuItem_Click(object sender, EventArgs e)
{
fs.Close();
}
但显然它没有达到我的预期,因为我能够在文件“锁定”时用记事本打开该文件。那么,如何锁定文件,使其无法使用其他应用程序打开以进行测试?
FileShare
枚举值 None
才能在 FileStream
构造函数重载: 上打开
fs = new FileStream(@"C:\Users\Juan Luis\Desktop\corte.txt", FileMode.Open,
FileAccess.ReadWrite, FileShare.None);
根据 http://msdn.microsoft.com/en-us/library/system.io.fileshare(v=vs.71).aspx
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.None);
虽然 FileShare.None 无疑是锁定整个文件的快速且简单的解决方案,但您可以使用 FileStream.Lock()
锁定文件的一部分public virtual void Lock(
long position,
long length
)
Parameters
position
Type: System.Int64
The beginning of the range to lock. The value of this parameter must be equal to or greater than zero (0).
length
Type: System.Int64
The range to be locked.
相反,您可以使用以下命令来解锁文件:FileStream.Unlock()
public virtual void Unlock(
long position,
long length
)
Parameters
position
Type: System.Int64
The beginning of the range to unlock.
length
Type: System.Int64
The range to be unlocked.
有多种方法可以锁定文件,即禁止文件共享。每个在特定场景中都有意义。
使用静态
File.Open
(或者任何其他静态File
API的开启方式)并传入FileShare.None
。FileStream
被释放,文件锁就会被释放:
await using FileStream lockedFile = File.Open(
"test.txt",
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.None);
使用
FileStream
构造函数并传入FileShare.None
。FileStream
被释放,文件锁就会被释放:
await using FileStream lockedFile = File.Open(
"test.txt",
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.None);
如果您需要对文件锁进行更多控制,请使用
FileStream.Lock
获取文件锁。 FileStream.Lock
需要流中的位置和长度作为参数来指定锁定的内容。这增加了更多的灵活性,因为我们可以锁定整个文件或仅锁定文件的一部分(部分文件锁定)。
通常,使用
FileStream.Unlock
显式释放文件或文件的一部分的锁定。该成员对于实现临时锁定很有用,而无需处置当前的 FileStream
。
await using var fileStream = new FileStream("test.txt", FileMode.Open);
// Lock the first 1024 Bytes of the file
fileStream.Lock(0, 1024);
// Lock the last 1024 Bytes of the file
fileStream.Lock(fileStream.Length - 1024, 1024);
// Release the lock for the first 1024 Bytes
// but keep the lock for the last 1024 Bytes
fileStream.Unlock(0, 1024);
// Lock the complete file
fileStream.Lock(0, fileStream.Length);
// Unlock the complete file
fileStream.Unlock(0, fileStream.Length);
我经常需要此功能,因此可以将其添加到我的
$PROFILE
中以从 PowerShell 中使用:
function Lock-File
{
Param(
[Parameter(Mandatory)]
[string]$FileName
)
# 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
Read-Host "Press Return to continue"
# Close the file (This releases the current handle and unlocks the file)
$file.Close()
}