2013-04-16 67 views
1

我有一個客戶端服務器應用程序,通過wcf在傳輸模式流進行通信。 當客戶端試圖下載文件的時候,它的工作正常,但是當客戶端嘗試把整個文件放在2個PE中時,下載的文件被損壞並且無法打開。流文件部分 - 不工作

客戶端代碼:

public void DownloadPart(Part Part) //Part: Part.From,Part.To -> possitions in the stream from where to begin and when to end reading 
       { 
        int ReadUntilNow = 0; 
        int ReadNow = 0; 
        byte[] Array= new byte[15000]; 
        long NeedToDownload = Part.To - Part.From; 
        using (FileStream MyFile = new FileStream(Path_To_Save_The_File, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) 
        { 
         MyFile.Position = Part.From; 
         while (ReadUntilNow < NeedToDownload) 
         { 
          ReadNow = this.SeederInterface.GetBytes(TorrentID, Part.From + ReadUntilNow, ref Array); 
          ReadUntilNow += ReadNow; 
          MyFile.Write(Array, 0, ReadNow); 
         } 
        } 
       } 

服務器代碼:

public int GetBytes(int TorrentID, int Position, ref byte[] Array) 
     { 
      FileStream File = new FileStream(FilePatch, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
      File.Position = Position; 
      return File.Read(Array, 0, Array.Length); 
     } 

我真的絕望,不知道是什麼問題。

回答

1

這將覆蓋任何現有的輸出文件。您有:

using (FileStream MyFile = new FileStream(Path_To_Save_The_File, 
    FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) 

這將創建一個新的文件,或覆蓋現有文件。

下一行,您有:

MyFile.Position = Part.From 

,將延長該文件,該文件的第一部分將包含垃圾 - 無論是在空間的磁盤上。

我想你想要的是在你的公開徵集修改ModeFileMode.OpenOrCreate,如:

using (FileStream MyFile = new FileStream(Path_To_Save_The_File, 
    FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) 

這將打開該文件,如果它已經存在。否則它會創建一個新文件。

您可能需要確定是否下載文件的第一部分(即新文件),如果是,則刪除任何現有文件。否則,您的代碼可能會覆蓋新文件的第一部分,但不會截斷。

+0

哇,這是我的錯誤...我不能相信它。非常感謝您的參與!我仍然無法相信我沒有看到它!謝謝你! –