2017-05-22 15 views
0

Filewatcherを使用してフォルダ内のファイルを検出し、そのファイルを新しい場所に移動しようとしました。コンソールアプリケーションを使用している間、私はThe process cannot access the file because it is being used by another processというエラーが発生しています。プロセスが別のプロセスで使用されているため、ファイルにアクセスできません - Filewatcher - C# - Console Application

OnChangedの方法でFile.Move(f.FullName, System.IO.Path.Combine(@"C:\Users\ADMIN\Downloads\FW_Dest", Path.GetFileName(f.FullName)));にこのエラーが表示されています。 下記のコードを確認し、この問題を解決してください。前もって感謝します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Security.Permissions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Run(); 

     } 

     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 

     public static void Run() 
     { 


      FileSystemWatcher watcher = new FileSystemWatcher(); 
      watcher.Path = @"C:\Users\ADMIN\Downloads\FW_Source"; 
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
      watcher.Filter = "*.*"; 

      watcher.Created += new FileSystemEventHandler(OnChanged); 
      watcher.EnableRaisingEvents = true; 

      Console.WriteLine("Press \'q\' to quit the sample."); 
      while (Console.Read() != 'q') ; 
     } 


     private static void OnChanged(object source, FileSystemEventArgs e) 
     { 

      DirectoryInfo directory = new DirectoryInfo(@"C:\Users\ADMIN\Downloads\FW_Source\"); 
      FileInfo[] files = directory.GetFiles("*.*"); 
      foreach (var f in files) 
      { 
       File.Move(f.FullName, System.IO.Path.Combine(@"C:\Users\ADMIN\Downloads\FW_Dest", Path.GetFileName(f.FullName))); 
      } 

     } 


    } 
} 

答えて

5

ファイルが変更されている間に、Changedイベントが発生しています。ファイルへのプロセス書き込みが完了する前に、ファイルを移動しようとしています。 I

最初にファイルを開く(読み取りを拒否し、書き込みを拒否する)こと、およびファイルを閉じてファイルを移動することが成功した場合にのみ、ファイルを開くことをお勧めします。成功しない場合は、数秒待ってからもう一度試してください。

+0

'ディレクトリ見つかりません例外でした処理されたエラーです。あなたは私を助けてくれますか... – METALHEAD

+0

あなたはフォルダ内のすべてのファイルを移動していますが、おそらく複数の通知があります。あなたが変更されたことを伝えたファイルを移動する必要があります。 – BugFinder

+0

こんにちは..ソースフォルダに1つのファイルしか置いていません。それでも 'ディレクトリが見つかりませんでした例外が処理されました'エラーです。あなたは助けてください。 – METALHEAD

1

代わりに、監視フォルダ内のすべてのファイルを移動するので、ちょうどそうのように、作成されたファイルを移動:次のようにThread.Sleep(2000)より

private static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    File.Move(e.FullPath, Path.Combine(@"C:\Users\ADMIN\Downloads\FW_Dest", e.Name)); 
} 

より良い方法2秒を待つためには次のようになります。

private static async void OnChanged(object source, FileSystemEventArgs e) 
{ 
    await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false); 

    File.Move(e.FullPath, Path.Combine(targetFolder, e.Name)); 
} 

これは、多くのファイルが同時にコピーされると、プログラムによって複数のスレッドがロックされないようにします。

+0

こんにちは、ご意見ありがとうございます。私はまだ同じ例外を取得しています - 'プロセスは別のプロセスで使用されているため、ファイルにアクセスできません。 '。あなたは私を助けてくれますか? – METALHEAD

+0

こんにちは、 'File.Move(e.FullPath、Path.Combine(@" C:\ Users \ ADMIN \ Downloads \ FW_Dest "、e.Name)の前にThread.Sleep(2000)を使用しています) ; '働いた。ウルのお返事ありがとうございました。 – METALHEAD

+0

ありがとうございました。 – METALHEAD

0

大きなファイルを監視フォルダに移動すると、この問題が発生しました。

私はOnChangeメソッドでIsLockedメソッドを呼び出し、falseを返すまでそれを移動しません。

while (IsFileLocked(ImportFormat.FileName)) { 
    //Do nothing until the file is finished writing 
} 

IsLocked方法:私は、私は、私が取得していますファイルの移動操作の前に(2000年)のThread.sleepを配置した少数のseconds-を待っていた

/// <summary> 
///  Tries to open the file for R/W to see if its lock. Returns Boolean 
/// </summary> 
/// <param name="filePath"></param> 
/// <returns>bool</returns> 
protected static bool IsFileLocked(string filePath) { 
    FileStream stream = null; 
    var file = new FileInfo(filePath); 
    try { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    }catch (IOException err) { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } finally { 
     stream?.Close(); 
    } 

    //file is not locked 
    return false; 
} 
関連する問題