C# - 如何检查文件是否存在于某个目录中(基于其内容,而不是文件名)?
C# - How do I check if a file exists in a certain directory (based on its content, not the file name)?
我正在创建一个程序,它将从结果目录(原始文件夹)中抓取文件并将这些文件移动到工作目录(另一个文件夹)。当文件从一个目录移动到另一个目录时,文件名会发生变化。在我移动它们之前,我需要检查工作目录是否不包含我已经尝试移动的文件。由于文件名正在更改,我需要一些东西来根据文件内部的内容检查文件是否已经存在。
假设我有:
FilesRD -(原始 Folder/Result 目录中的文件)
FilesWD -(其他 Folder/Working 目录中的文件)
这些目录中的文件将如下所示...
之前(在结果目录中):
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 函数,只有当它找到与模式匹配的文件时它才是 return。
尝试比较文件哈希值。
这是一个例子:
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);
}
我正在创建一个程序,它将从结果目录(原始文件夹)中抓取文件并将这些文件移动到工作目录(另一个文件夹)。当文件从一个目录移动到另一个目录时,文件名会发生变化。在我移动它们之前,我需要检查工作目录是否不包含我已经尝试移动的文件。由于文件名正在更改,我需要一些东西来根据文件内部的内容检查文件是否已经存在。
假设我有:
FilesRD -(原始 Folder/Result 目录中的文件)
FilesWD -(其他 Folder/Working 目录中的文件)
这些目录中的文件将如下所示...
之前(在结果目录中):
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 函数,只有当它找到与模式匹配的文件时它才是 return。
尝试比较文件哈希值。 这是一个例子:
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);
}