如何使用C#锁定文件?

Jua*_*uan 22 c# io

我不确定人们通常通过"锁定"文件意味着什么,但我想要的是对我将尝试用另一个文件打开它时会产生"指定文件正在使用"的文件执行该操作应用.

我想这样做来测试我的应用程序,看看当我尝试打开处于此状态的文件时它的行为.我试过这个:

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();
}
Run Code Online (Sandbox Code Playgroud)

但显然它并没有达到我的预期,因为我能够在"锁定"时用记事本打开文件.那么如何锁定文件以便无法使用其他应用程序打开它以进行测试?

Ric*_*lay 39

你需要在构造函数重载上传入一个FileShare枚举值Noneto open :FileStream

fs = new FileStream(@"C:\Users\Juan Luis\Desktop\corte.txt", FileMode.Open, 
    FileAccess.ReadWrite, FileShare.None);
Run Code Online (Sandbox Code Playgroud)

  • 希望我有时可以接受这两个答案,因为它们几乎完全一样.希望你不介意我接受另一个人,因为他的分数较低:) (30认同)

Bug*_*der 38

根据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);
Run Code Online (Sandbox Code Playgroud)


Pau*_*hra 5

虽然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. 
Run Code Online (Sandbox Code Playgroud)

相反,你可以使用以下来解锁文件: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. 
Run Code Online (Sandbox Code Playgroud)