如何关闭文件句柄byte [] firstHash = MD5.Create()。ComputeHash(f1.OpenRead());

时间:2016-12-08 17:26:57

标签: c#

我有一段很好用的代码。但是,我需要关闭文件,以便我可以执行file.move()函数,这不起作用,因为该文件由另一个进程使用。我需要使用正确的文件句柄 - 你能指导我正确的方向吗?

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 个答案:

答案 0 :(得分:1)

您可以将f1.OpenRead()的流捕获到变量&amp;传递完成时调用Close(),但是您应该将流和MD5引用放在using构造中,因为当前您不会将它们置于其中。 (这也将关闭你的流)

byte[] firstHash;

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

}