2012-10-21 114 views
0

我有下面的代碼,它使用計時器爲我移動文件(每10分鐘200個文件被移動或保存在我的設置窗體中)。如何檢查文件是否打開/寫入C#

問題是文件在被打開和寫入時會被移動,我知道我必須在程序中「打開」它並檢查異常,但我無法弄清楚我的代碼中應該放置哪些位置它?

try 
{ 
      string origDir = @"" + Properties.Settings.Default.MoveFrom; 
      string destDir = @"" + Properties.Settings.Default.MoveTo; 
      string oldDir = @"" + Properties.Settings.Default.MoveToOld; 

      int filesPerMove = Properties.Settings.Default.FilesPerMove; 
      int i = 0; 

      DateTime dateMove= DateTime.Now; 

      DirectoryInfo dirInfo = new DirectoryInfo(origDir); 
      FileInfo[] files = dirInfo.GetFiles("*.txt"); 

      foreach (string file in Directory.GetFiles(origDir)) 
       if (new FileInfo(file).Length > 0) 
       { 
        if (i < filesPerMove) 
        { 
          ListViewItem lviSuccess = new ListViewItem(origFile.Name); 
          lviSuccess.SubItems.Add(origFile.LastWriteTime.ToString()); 
          lviSuccess.SubItems.Add(dateMove.ToString()); 
          lviSuccess.SubItems.Add(origFile.Length.ToString()); 
          lviSuccess.SubItems.Add(origDir.ToString()); 
          lviSuccess.SubItems.Add(destDir.ToString()); 
          lvFileMoves.Items.Add(lviSuccess); 
          lviSuccess.UseItemStyleForSubItems = true; 
          lviSuccess.ForeColor = Color.Green; 

          FileInfo destFile = new FileInfo(file.Replace(origDir, destDir)); 
          FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir)); 
          System.IO.File.Copy(origFile.FullName, destFile1.FullName, true); 
          System.IO.File.Copy(origFile.FullName, destFile.FullName, true); 
          File.Delete(origFile.FullName);       
          i++; 
         } 
        } 
} 
catch (System.IO.IOException ex) 
{ 
      ListViewItem lvi = new ListViewItem(ex.Message); 
      lvFileMoves.Items.Add(lvi); 
      lvi.UseItemStyleForSubItems = true; 
      lvi.ForeColor = Color.Red; 
} 
+0

,你可以嘗試使用FileInfo的陣列後catch塊。 –

+0

嗨你能舉一些例子嗎? – user1538062

回答

0

您應該將異常處理接近文件處理:

try 
{ 
    FileInfo destFile = new FileInfo(file.Replace(origDir, destDir)); 
    FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir)); 
    System.IO.File.Copy(origFile.FullName, destFile1.FullName, true); 
    System.IO.File.Copy(origFile.FullName, destFile.FullName, true); 
    File.Delete(origFile.FullName);       
    i++; 
} 
catch(System.IO.IOException ex) 
{ 
    ListViewItem lvi = new ListViewItem(ex.Message); 
    lvFileMoves.Items.Add(lvi); 
    lvi.UseItemStyleForSubItems = true; 
    lvi.ForeColor = Color.Red; 
} 

這樣,當一個文件失敗,您可以用下列文件繼續。

+0

問題仍然存在,即我的程序移動了我在記事本中打開的文件 – user1538062

+0

記事本在打開文件時沒有鎖定文件。沒有辦法檢查記事本(或記事本2)打開的文件。但是,如果它是由MS Word或OpenOffice Writer打開的,文件將被鎖定,您可以檢查它。詳情請參閱http://stackoverflow.com/questions/11427265/is-there-a-way-to-programmatically-check-if-a-excel-file-is-opened – Casperah

0

現在我下面有,但它trows的例外每個文件甚至對於我沒有在記事本中打開的文件。

FileStream outStream = null; 
try 
        { 
         outStream = File.OpenWrite(origFile.ToString()); 

          FileInfo destFile = new FileInfo(file.Replace(origDir, destDir)); 

          FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir)); 
          System.IO.File.Copy(origFile.FullName, destFile1.FullName, true); 
          System.IO.File.Copy(origFile.FullName, destFile.FullName, true); 
          File.Delete(origFile.FullName); 
          lblSenast.Text = string.Format("Senaste flytt gjordes {0}",  dateMove.ToString()); 
        } 
        catch (IOException exx) 
        { 
         ListViewItem lvi = new ListViewItem(exx.Message); 
         lvFileMoves.Items.Add(lvi); 
         lvi.UseItemStyleForSubItems = true; 
         lvi.ForeColor = Color.Gray; 
        } 
        finally 
        { 
         outStream.Close(); 
         outStream.Dispose(); 
        } 

該進程無法訪問文件「唧唧歪歪」,因爲它正被另一個進程使用