none
filestream 複制檔案 不能更新複制資訊 RRS feed

  • 問題

  •  

    我用filestream 複制檔案,我想加入progress bar 及 label 來顯示複制情況,但是當複制的時候 張window form 呆住了,要等完全複制完畢才可以顯示資料,我試過開一支新thread 雖然畫面呆住的問題解決 但新thread不可以更新main thread的ui,有沒有辦法可以解決這個問題。

     

    我的code是這樣的

     

    FileStream fin, fout;
    int SizeBuff = 1;
    fin = new FileStream(@"D:\a.zip", FileMode.Open, FileAccess.Read, FileShare.Read);
    fout = new FileStream(@"D:\b.zip", FileMode.Create);

    progressBar1.Maximum = Convert.ToInt32(fin.Length);
    this.progressBar1.Value = 0;
    byte[] buffer = new Byte[SizeBuff];

    while ((bytesRead = fin.Read(buffer, 0, SizeBuff))  > 0)
    {
     fout.Write(buffer, 0, bytesRead);
     if ((progressBar1.Value + bytesRead) <= progressBar1.Maximum)
     {
      this.progressBar1.Value += bytesRead;

     }
     else
     {
      this.progressBar1.Value = this.progressBar1.Maximum;
     }
    }

    fin.Close();
    fout.Close();

    2008年10月22日 上午 08:10

解答

  •  

    試過backgroundworder放了一支thread裏面做 畫百呆住的問題可以解決 但是複制檔案的時候 那支thread很busy 不能把工作資訊return出來 有沒有辦法可以解決
    2008年10月23日 上午 02:23
  • HI,

     

    這樣做比較快

     

    1) 參考Microsoft.VisualBasic.dll組件

    2) 寫以下的程式

     

    Code Snippet
    Microsoft.VisualBasic.Devices.Computer c=new Microsoft.VisualBasic.Devices.Computer();
    c.FileSystem.CopyFile(來源檔案名稱, 目的檔案名       稱 ,  Microsoft.VisualBasic.FileIO.UIOption.AllDialogs);

     

     

    tihs

     

    2008年10月23日 上午 02:31

所有回覆

  • 請使用 BackgroundWorker,用 "BackgroundWorker" 當關鍵字搜尋本論壇或 Google,會有一堆範例給你看。

     

    2008年10月22日 上午 08:51
    版主
  •  

    試過backgroundworder放了一支thread裏面做 畫百呆住的問題可以解決 但是複制檔案的時候 那支thread很busy 不能把工作資訊return出來 有沒有辦法可以解決
    2008年10月23日 上午 02:23
  • HI,

     

    這樣做比較快

     

    1) 參考Microsoft.VisualBasic.dll組件

    2) 寫以下的程式

     

    Code Snippet
    Microsoft.VisualBasic.Devices.Computer c=new Microsoft.VisualBasic.Devices.Computer();
    c.FileSystem.CopyFile(來源檔案名稱, 目的檔案名       稱 ,  Microsoft.VisualBasic.FileIO.UIOption.AllDialogs);

     

     

    tihs

     

    2008年10月23日 上午 02:31
  • 但是我不是直接local drive 做檔案複制 我的檔案是由rpc複制下來的 所以要用filestream 有沒有辦法做到我上面談過的功能的

     

    謝謝
    2008年10月23日 上午 03:03
  • 適當的呼叫 Thread.Sleep(xxx)

    2008年10月23日 上午 03:47
  • I add thread.sleep() in the program. It is success to perform my function.

     

    Thank you.

     

    2008年10月23日 上午 04:32
  • I add thread.sleep() in the program. It is success to perform my function.

     

    Thank you.

     


    請問把thread.sleep() 加到哪裏呢?

    我試過加在while 裏面, 複制的時候就呆機了....

    while ((bytesRead = fin.Read(buffer, 0, SizeBuff))  > 0)
    {
     fout.Write(buffer, 0, bytesRead);
     if ((progressBar1.Value + bytesRead) <= progressBar1.Maximum)
     {
      this.progressBar1.Value += bytesRead;

     }
     else
     {
      this.progressBar1.Value = this.progressBar1.Maximum;
     }

     Thread.Sleep(1) ;
    }

    2010年10月26日 上午 08:35
  • 請問把thread.sleep() 加到哪裏呢?

    我試過加在while 裏面, 複制的時候就呆機了....

    while ((bytesRead = fin.Read(buffer, 0, SizeBuff))  > 0)
    {
     fout.Write(buffer, 0, bytesRead);
     if ((progressBar1.Value + bytesRead) <= progressBar1.Maximum)
     {
      this.progressBar1.Value += bytesRead;

     }
     else
     {
      this.progressBar1.Value = this.progressBar1.Maximum;
     }

     Thread.Sleep(1) ;
    }

    你有使用BackgroundWorker 或是Thread 之類的多執行緒執行嗎 ? 如果你的迴圈放在主UI執行緒, 是一定會呆住的

    另請參考

    [http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/17ddfdd3-0267-417c-b6ff-98be62e0330f]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月26日 上午 08:44
    版主