2012-06-20 194 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(); 
       } 
      } 
     } 

仍然會導致錯誤。

相關問題