【问题标题】:Is there any way to read data from a locked file?有没有办法从锁定的文件中读取数据?
【发布时间】:2012-06-22 19:17:42
【问题描述】:

这是我的想法:

        var file = @"myfile";
        File.Open(file,
                  FileMode.Open, FileAccess.ReadWrite, FileShare.None);

        using (StreamReader rdr = new StreamReader(File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)))
        {
            rdr.ReadToEnd();
        }
        var t = File.ReadAllBytes(file);

File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)File.ReadAllBytes 都不能读取文件数据。

从我以前的 c++ 和 winapi 时代开始,我确实记得,如果您有备份权限,曾经有一种读取锁定文件的好方法,但我不知道如何在 c# 中获取和使用这些文件。

谁能提供一个示例,说明如何在文件被锁定后读取文件?

【问题讨论】:

  • 如果它被锁定,您将无法阅读它。这有点像锁定的意义。
  • 有问题的锁定是由其他进程完成的。我将在更新程序中使用它,检查有问题的文件是否需要替换(例如,如果更新的进程需要重新启动)
  • "FileShare.None" 是一个完全锁,因此尝试从中读取是行不通的。原始打开必须至少允许“FileShare.Read”

标签: c# file file-io io


【解决方案1】:

好吧,如果文件被完全锁定(不是sharing),您将无法读取它。如果文件打开到share read,您将能够使用非侵入式方法读取:

string fileName = @"myfile";
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (StreamReader fileReader = new StreamReader(fileStream ))
{
    while (!fileReader .EndOfStream)
    {
        string line = fileReader .ReadLine();
        // Your code here
    }
}

【讨论】:

【解决方案2】:

实际上我试图做的事情是不可能的,备份权限也无济于事:

       [DllImport("kernel32.dll", CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall,
        SetLastError = true)]
            public static extern SafeFileHandle CreateFile(
                string lpFileName,
                uint dwDesiredAccess,
                uint dwShareMode,
                IntPtr SecurityAttributes,
                uint dwCreationDisposition,
                uint dwFlagsAndAttributes,
                IntPtr hTemplateFile
            );

    private static uint READ_CONTROL = 0x00020000;
    private static uint OPEN_EXISTING = 3;
    private static uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;


        var file = @"myfile";
        File.Open(file,
                  FileMode.Open, FileAccess.ReadWrite, FileShare.None);

        using(PrivilegeEnabler pe = new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.Backup))
        {
            var hFile = CreateFile(file,           // lpFileName
                       READ_CONTROL,               // dwDesiredAccess
                       0,                          // dwShareMode
                       IntPtr.Zero,                // lpSecurityAttributes
                       OPEN_EXISTING,              // dwCreationDisposition
                       FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                       IntPtr.Zero);               // hTemplateFile
            using (var fs=new  FileStream(hFile.DangerousGetHandle(),FileAccess.Read))
            {
                using (StreamReader rdr=new StreamReader(fs))
                {
                    rdr.ReadToEnd();
                }
            }
        }

仍然会导致错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2018-06-10
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多