2012-06-20 165 views
3

这就是我心目中:有没有办法从锁定的文件中读取数据?

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

Neigther File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)也不File.ReadAllBytes可以读取文件中的数据。

从我以前的C++和winapi的日子里,我记得,如果你有备份特权,曾经有一种很好的方式来读取锁定的文件,但我不知道如何在c#中获取和使用它们。

任何人都可以提供一个关于如何在文件被锁定后读取文件的示例吗?

+0

如果它被锁定,你不应该能够读取它。这只是一个锁定点。 – Servy

+0

有问题的锁是由其他进程完成的。我将在更新程序中使用它来检查是否需要替换文件(例如,如果更新过程需要重新启动) –

+1

“FileShare.None”是一个完全锁定,因此尝试从中读取将不起作用。原始打开必须至少允许“FileShare.Read” – Quintium

回答

6

那么,如果文件被完全锁定(没有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 
    } 
} 
+0

这是我尝试过的事情之一。这在这里不起作用 –

+0

所以,恐怕文件被其他进程完全锁定。您可以使用ProcessExplorer(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)查看哪个进程正在锁定文件。 –

1

我试图其实做的是不可能的,备份特权并没有帮助:

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

仍然会导致错误。

相关问题