2012-02-18 37 views
0

我正在使用C#和Dokan庫編寫我的文件系統,並卡在WriteFile上。與Dokan實現虛擬驅動器。卡在WriteFile上

public int WriteFile(
      String filename, 
      Byte[] buffer, 
      ref uint writtenBytes, 
      long offset, 
      DokanFileInfo info) 
     {   
      try 
      { 
       FileStream fs = File.OpenWrite(GetFullPath(filename) , FileMode.Open);    
       fs.Seek(offset, SeekOrigin.Begin); 
       fs.Lock(offset, buffer.Length); 
       fs.Write(buffer, 0, buffer.Length); 
       fs.Unlock(offset, buffer.Length); 
       writtenBytes = (uint)buffer.Length; 
       return 0; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("FAIL WriteFile {0}", e.Message); 
       return -1; 
      } 
     } 

當我運行應用程序並從Dokan的虛擬驅動器打開txt文件時,添加一些行並嘗試保存它。我從記事本中收到錯誤「參數不正確」。

在代碼中,我得到File.OpenWrite()調用異常。 System.IO.IOException異常。消息:「進程無法訪問文件foo.txt,因爲它正在被另一個進程使用。」

  • 文件只能用記事本打開。
  • 同樣的行爲可以用杜坎庫
  • 我在清單中添加管理員權限到我的計劃投放的鏡子例如可以觀察到,它並沒有幫助

杜坎應該爲代理工作,允許調用用戶定義的WriteFile,對吧?如果它被鎖定寫入,我該如何做到這一點?

請幫助。也許你對Dokan有任何經驗,或者有任何線索爲什麼不起作用。

我使用 - Win 7的臨64 - 64位杜坎司機 - 應用程序被編譯爲86

+0

是否爲32位,64位或AnyCPU(適用於您的代碼和Dokan)編譯了驅動程序?你正在測試的個人電腦有多少位? – 2012-02-18 01:42:50

+1

也許我在誤讀,但它看起來像記事本要求Windows保存到Y:\ text.txt,Windows將它轉發到Dokan,Dokan將它轉發給您,您將它傳回給Windows,路徑相同?如果你想代理現有的文件,你不應該確保你使用不同的路徑嗎? – hvd 2012-02-18 01:44:24

+0

hvd我不知道如果Windows從VirtualDriveLetter:\ foo.txt或從實際路徑獲取它。我在WriteFile中獲得的文件名是「\ foo.txt」,然後添加它的完整路徑ActualDriveLetter:\ path \ file並嘗試用File.OpenWrite打開它 – WannabeCoder 2012-02-18 02:08:48

回答

1

離開方法之前,必須調用Dispose流。 這不是最好的解決方案。您可以在CreateFile中構造文件流,將其傳遞給info.Context,並在ReadFile,WriteFile中使用它,並在Cleanup中調用它。

+0

感謝您的回覆!我會嘗試的。 – WannabeCoder 2012-02-22 20:16:38

+0

我試過你的解決方案。它的工作原理,但是..但是我可以在記事本中打開文本文件,做一些更改,關閉記事本並保存這些更改。但是當我做第二次記事本說「無效的參數」。問題是我在CleanUp中只處理了FileSteam,當我在Dispose和CleanFile中都處理時,一切似乎都可以正常工作。請告訴我什麼是關閉文件的正確方法。是否應該在CleanUp和CloseFile中處理FileStream的相同代碼?哪一個先被調用。預先感謝! – WannabeCoder 2012-02-22 22:48:06

+0

CloseFile有時不會被調用,但清理總是在這裏看看http://liquesce.codeplex.com/SourceControl/changeset/view/73752 – user629926 2012-02-26 14:51:33