如何用C#锁定文件?

问题描述 投票:0回答:5

我不确定人们通常所说的“锁定”文件是什么意思,但我想要的是对一个文件执行此操作,当我尝试使用以下命令打开它时,该文件将产生“指定的文件正在使用”错误消息另一个应用程序。

我想这样做是为了测试我的应用程序,看看当我尝试打开处于这种状态的文件时它的行为如何。我试过这个:

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();
}

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

c# io
5个回答
62
投票

您需要传入

FileShare
枚举值
None
才能在
FileStream
构造函数重载
:

上打开
fs = new FileStream(@"C:\Users\Juan Luis\Desktop\corte.txt", FileMode.Open, 
    FileAccess.ReadWrite, FileShare.None);

56
投票

根据 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);

9
投票

虽然 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. 

0
投票

有多种方法可以锁定文件,即禁止文件共享。每个在特定场景中都有意义。

  1. 使用静态

    File.Open
    (或者任何其他静态
    File
    API的开启方式)并传入
    FileShare.None

    重要的是要理解,一旦离开使用范围,即
    FileStream
    被释放,文件锁就会被释放:

    await using FileStream lockedFile = File.Open(
      "test.txt", 
      FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, 
      FileShare.None);
    
  2. 使用

    FileStream
    构造函数并传入
    FileShare.None

    重要的是要理解,一旦离开使用范围,即
    FileStream
    被释放,文件锁就会被释放:

    await using FileStream lockedFile = File.Open(
      "test.txt", 
      FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, 
      FileShare.None);
    
  3. 如果您需要对文件锁进行更多控制,请使用

    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);
    

-1
投票

我经常需要此功能,因此可以将其添加到我的

$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()
}
© www.soinside.com 2019 - 2024. All rights reserved.