C#-如何检查某个目录中是否存在文件(基于其内容,而不是文件名)?

C#-如何检查某个目录中是否存在文件(基于其内容,而不是文件名)?,c#,file-moving,C#,File Moving,我正在创建一个程序,它将从结果目录(原始文件夹)中获取文件,并将这些文件移动到工作目录(另一个文件夹)。在这里,当文件从一个目录移动到另一个目录时,文件名正在更改。在移动它们之前,我需要检查工作目录是否不包含我正在尝试移动的文件。由于文件名正在更改,我需要一些东西来根据文件中的内容检查文件是否已经存在 假设我有: FilesRD-(原始文件夹/结果目录中的文件) FilesWD-(其他文件夹/工作目录中的文件) 这些目录中的文件将如下所示… 之前(在结果指南中): Log_123.csv 之后(

我正在创建一个程序,它将从结果目录(原始文件夹)中获取文件,并将这些文件移动到工作目录(另一个文件夹)。在这里,当文件从一个目录移动到另一个目录时,文件名正在更改。在移动它们之前,我需要检查工作目录是否不包含我正在尝试移动的文件。由于文件名正在更改,我需要一些东西来根据文件中的内容检查文件是否已经存在

假设我有:

FilesRD-(原始文件夹/结果目录中的文件)
FilesWD-(其他文件夹/工作目录中的文件)

这些目录中的文件将如下所示…

之前(在结果指南中):
Log_123.csv

之后(在工作目录中):

Log_123_2015_24_6.csv

我会尝试以下功能,但这远远不够完美:

    private bool CheckIfFileAlreadyExist(string WorkingDirectory, string FileToCopy)
    {
        string FileToCheck = File.ReadAllText(FileToCopy);
        foreach (string CurrentFile in Directory.GetFiles(WorkingDirectory))
        {
            if (File.ReadAllText(CurrentFile) == FileToCheck)
                return true;
        }
        return false;
    }
更新:

另一种方法是读取ByteArray,这将解决图像问题。但是函数仍然会随着时间的推移而变慢

    private bool CheckIfFileAlreadyExist(string WorkingDirectory, string FileToCopy)
    {
        byte[] FileToCheck = File.ReadAllBytes(FileToCopy);
        foreach (string CurrentFile in Directory.GetFiles(WorkingDirectory))
        {
            if (File.ReadAllBytes(CurrentFile) == FileToCheck)
                return true;
        }
        return false;
    }

您需要使用system.io命名空间签入目标文件夹,例如:

string destination = "c:\myfolder\"; 
string [] files   Directory.GetFiles(destination , "Log_123");
if(files.Length == 0)
{
   //move the file to the directory
}

您可以将模式添加到getfiles函数中,前提是它发现文件与模式匹配并返回该模式。

尝试比较文件哈希值。 下面是一个例子:

        private static string GetFileMD5(string fileName) {
            using (var md5 = MD5.Create()) {
                using (var fileStream = File.OpenRead(fileName)) {
                    return BitConverter.ToString(md5.ComputeHash(fileStream)).Replace("-", "").ToLower();
                }
            }
        }
        private static bool DoesFileExist(string workingDir,string fileName) {
            var fileToCheck = GetFileMD5(fileName);
            var files = Directory.EnumerateFiles(workingDir);
            return files.Any(file => string.Compare(GetFileMD5(file), fileToCheck, StringComparison.OrdinalIgnoreCase) == 0);
        }

如果文件相同,则可以获取文件内容的哈希\crc并进行比较。这是一个相当广泛的问题,您需要在目标目录中的所有文件和当前文件之间进行文件内容比较。这可能需要很多时间,具体取决于文件的数量和大小。这可能是一个起点。我来这里是想说和“MartinParkin”一样的话,。。您可以尝试对文件内容进行哈希运算。。结果是一样的。。如果它是一个单一的程序,我想你可以访问它的所有方面(或者你使用外部的东西?)。您不能跟踪哪些文件已被移动,或者至少记录文件的新名称吗?工作目录中的文件是否始终以原始名称开头?哪个程序进行重命名?虽然这似乎可以解决OPs问题,但对文件进行文本比较可能会异常缓慢。您最好创建一个文件内容的散列并进行比较。出于好奇,如果文件是图像,会发生什么?@user1666620这将失败,因为它假设它们是文本。因此使用散列:)您需要在此处使用
可枚举的.SequenceEqual
,而不是
=
,因为您希望比较它们的内容,而不是它们的标识。查询是查找重复的文件内容,非文件名这无法确定文件内容是否与OP要求的内容相同。如果要按内容检查,则需要为每个文件创建唯一的MD5,并在新MD5之间进行比较,如果存在匹配项,则表示内容已存在。。。您认为给定流的哈希是如何计算的。。。?