2016-03-01 37 views
1

有關此錯誤的大多數C#SO問題都涉及到Streamwriter。我不相信這個問題是相關的。在Backgroundworker中重命名文件時,文件正在被「正被另一個進程使用」

我有一個WinForms應用程序。該應用程序產生一個背景工作者來做真正的工作(圖像處理),以保持響應。在一個函數中,我嘗試重命名一個目錄中的所有圖像文件(不打開它們)。我收到錯誤「該進程無法訪問該文件,因爲它正在被另一個進程使用。」「我無法追查到錯誤的來源。

在MainForm的(形式)的類 - 產卵BackgroundWorker的:

private void b_preprocessImages_Click(object sender, EventArgs e) 
    { 
     if (bgw_preprocessor.IsBusy == false) 
     { 
      bgw_preprocessor.RunWorkerAsync(); 
     } 
     else 
     {...} 
    } 

仍然在MainForm類 - 用於BackgroundWorker的DoWork的方法:

private void bgw_preprocessor_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     ImagePreprocessor preprocessor = new ImagePreprocessor(); 
     preprocessor.SetImageDirectoryPath(path); 
     preprocessor.PreprocessImages(worker);  
    } 

內部ImagePreprocessor類 - 方法BackgroundWorker的運行:

public void PreprocessImages(BackgroundWorker worker) 
    { 
     this.worker = worker; 

     if (!Directory.Exists(SourceImageDirectoryPath)) 
      return; 
     else 
     {...} 

     if (!AreAllImagesValid()) 
      return; 
     else 
     {...} 

     print.PrintLine("Renaming files..."); 
     AutoRenameAllImages(); 

Inside ImagePreprocessor class - method to r爲ename圖片:

public void AutoRenameAllImages() 
    { 
     for (int i = 0; i < sourceImageFiles.Length; i++) 
     { 
      // sourceImageFiles[] is an array of strings 
      FileInfo f = new FileInfo(sourceImageFiles[i]); 
      string newName = Path.Combine(SourceImageDirectoryPath, "src_" + i.ToString() + f.Extension); 
      print.PrintLine("Renaming " + f.Name + " to " + (new FileInfo(newName)).Name); 

      try 
      { 
       f.MoveTo(newName); 
       //File.Move(sourceImageFiles[i], newName); // doesn't work either 
      } 
      catch (Exception ex) 
      { 
       ... 
      } 
     } 
    } 

的錯誤後立即嘗試重命名的第一個文件遇到。據我所知,沒有任何文件在其他應用程序中打開。我怎樣才能解決這個問題?

+0

使用句柄命令行工具查看哪些進程對這些文件具有保留。 https://technet.microsoft.com/en-us/sysinternals/handle.aspx – Cobster

+0

這個問題很可能是你在你的應用程序**中使用了這個文件,而不是其他應用程序。你忘了關閉它。 – Sakura

+0

我根本沒有打開任何文件的代碼 - 到目前爲止,只有獲取文件名,計數文件,重命名它們等。@Cobster我會看到我可以找到與該處理工具。 – natedogg

回答

0

看看你是否可以刪除IDE打開的文件。如果您無法關閉IDE並嘗試再次刪除該文件。如果它工作,該文件被IDE保持打開。如果您在運行代碼時忘記關閉文件,通常會發生這種情況。

我不是說這會解決問題,但它會排除IDE和調試問題。

我以前見過這種情況。

+0

我可以使用Visual Studio打開刪除文件。但是,當我運行程序並解決錯誤時,我無法手動刪除它(文件在vshost32.exe中打開)。我沒有任何明確的代碼來打開任何文件。 – natedogg

+0

這意味着文件是用Visual Studio打開的,無論是通過代碼還是像文件一樣的調用移動並且沒有正確關閉。您將不得不關閉IDE以釋放該文件。 –

+0

即使您不知道他們這麼做,許多電話也會打開該文件。例如, File.Moveto以我認爲它複製文件並刪除舊文件的方式工作,以便文件被打開。 之前有一個移動我們做了手動複製和手動刪除 –

相關問題