2016-12-08 4 views
0

私はうまく動作するコードを持っています。しかし、ファイルを閉じてfile.move()関数を実行できるようにする必要があります。ファイルが別のプロセスで使用されているため、これは機能しません。私は正しいファイルハンドルを使用する必要があります - 正しい方向に私を導くことができますか?ファイルハンドルを閉じる方法byte [] firstHash = MD5.Create()。ComputeHash(f1.OpenRead());

static void DSCheckForDuplicates(string incomingfolder, string incomingarchivefolder, string quarantinefolder) 
{ 
    string[] F1 = Directory.GetFiles(incomingfolder); 
    string fname = ""; 
    long FileOne; 
    long FileTwo; 
    bool FilesAreTrullyIdentical; 
    string FileStatusValue = ""; 
    string Result = ""; 
    string NewLocation = ""; 

    foreach (string fileName in F1) 
    { 
     // FILE EXCLUSION LIST FROM DUPLICATE FILE CHECKS 
     if (fileName.Contains("xxx.DAT") || fileName.Contains("xxx.txt") || fileName.Contains("OrderHead.txt")) 
     { 
      Console.WriteLine("\nKnown file type.."); 
     } 
     else 
     { 
      fname = Path.GetFileName(fileName); 
      FilesAreTrullyIdentical = false; 
      Console.WriteLine("Files present : The file is {0}...Press any key\n", fileName); 
      //Console.ReadKey(); 
      if (File.Exists(incomingarchivefolder + @"\" + fname)) 
      { 
       DuplicateFlag = true; 
       FileStatusValue = "DuplicateFilename"; 
       DuplicateFileCounter++; 
       Narative += string.Format("\n________________________________________________________________________________________________________________\nFile Exception :{0}\n####################\n", DuplicateFileCounter); 
       Narative += string.Format ("Same filename exists in the two compared directories, Checking potential duplicate file contents in :{0}................\n", fileName); 
       FileInfo f1 = new FileInfo(fileName); 
       FileOne = f1.Length; 
       FileInfo f2 = new FileInfo(incomingarchivefolder + @"\" + fname); 
       FileTwo = f2.Length; 
       //if (FileOne == FileTwo) 
       //{ 
       byte[] firstHash = MD5.Create().ComputeHash(f1.OpenRead()); 
       byte[] secondHash = MD5.Create().ComputeHash(f2.OpenRead()); 
       for (int i = 0; i < firstHash.Length; i++) 
       { 
        FilesAreTrullyIdentical = true; 
        if (firstHash[i] != secondHash[i]) 
         FilesAreTrullyIdentical = false; 
       } 

       if (FilesAreTrullyIdentical == true) 
       { 
        FileStatusValue = "DuplicationFileNameDuplicateContents"; 
        Console.WriteLine("Processed : WARNING!!! identical FILES contents FOUND {0}\n and {1}\n..............\n", fileName, incomingarchivefolder + @"\" + fname); 
        Narative += string.Format("\tProcessed : Please delete from incoming, WARNING!!! identical FILES contents\n\nPLEASE DELETE FILE:\t{0}..............\n", fileName); 
        Result = Path.GetFileName(fileName); 
        NewLocation += quarantinefolder + "\\" + Result; 
        Console.WriteLine("\n\n {0} ->\nMoving to {1} , press any key", fileName, NewLocation); 
        Console.ReadKey(); 
        //File.Move(fileName, NewLocation); // THIS DOESNT WORK 
+1

(これはまたあなたのためのストリームを閉じます)ここを見て、 'FileStream'を使用してだけでなく、'「オブジェクトのHTTPSの自動処分を処理するために(){}を使用しての周りにあなたのコードをラップしてみてください。 //msdn.microsoft.com/en-us/library/system.io.fileinfo.openread(v=vs.110).aspx – MethodMan

答えて

1

は、あなたは、現在あなたがundisposedそれらを残しusing構文内のストリームとMD5の参照を置く必要がある代わりに、しかし、あなたの行われたときにClose()を呼び出す変数&パスにf1.OpenRead()からのストリームをキャプチャすることができます。

byte[] firstHash; 

using (var stream = f1.OpenRead()) 
using (var md5 = MD5.Create()) 
{ 
    firstHash = md5.ComputeHash(stream); 

} 
+0

ありがとうございました。これで問題は解決しました。 file.move()が動作するようになりました。 –

関連する問題