C# 对磁盘指定目录全量扫描 ,规避已扫描文件被重复扫描,有变更的文件可被再次扫描到,请给出具体实现
时间: 2023-08-02 15:08:38 浏览: 47
以下是一个简单的 C# 实现,可以实现对指定目录下的所有文件进行全量扫描,同时可以避免已经扫描过的文件再次被扫描,有变更的文件可以被再次扫描到。
```csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
namespace FileScanner
{
class Program
{
static void Main(string[] args)
{
string path = @"C:\test"; // 指定扫描的目录
var fileList = new List<string>();
// 读取已扫描过的文件列表
var scannedFiles = ReadScannedFiles();
// 遍历目录下的所有文件
foreach (string file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
{
if (!scannedFiles.Contains(file)) // 如果该文件没有被扫描过
{
fileList.Add(file); // 将该文件添加到扫描列表中
}
else // 如果该文件已经被扫描过
{
// 计算文件的 MD5 值
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(file))
{
var hash = md5.ComputeHash(stream);
string currentHash = BitConverter.ToString(hash).Replace("-", "").ToLower();
string scannedHash = GetHashFromFile(file);
if (currentHash != scannedHash) // 如果文件内容有变更
{
fileList.Add(file); // 将该文件添加到扫描列表中
}
}
}
}
}
// 对扫描列表中的文件进行处理
foreach (var file in fileList)
{
// 处理文件,例如读取文件内容等等
Console.WriteLine(file);
}
// 将已扫描过的文件列表保存到文件中
SaveScannedFiles(fileList);
}
// 读取已扫描过的文件列表
static List<string> ReadScannedFiles()
{
var list = new List<string>();
if (File.Exists("scanned_files.txt"))
{
using (var reader = new StreamReader("scanned_files.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
list.Add(line);
}
}
}
return list;
}
// 将已扫描过的文件列表保存到文件中
static void SaveScannedFiles(List<string> fileList)
{
using (var writer = new StreamWriter("scanned_files.txt"))
{
foreach (var file in fileList)
{
writer.WriteLine(file);
}
}
}
// 计算文件的 MD5 值
static string GetHashFromFile(string file)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(file))
{
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
}
}
}
```
以上代码首先读取已经扫描过的文件列表,然后遍历目录下的所有文件,如果某个文件没有被扫描过,则将其添加到扫描列表中;如果某个文件已经被扫描过,则计算文件的 MD5 值,如果文件内容有变更,则将其添加到扫描列表中。最后对扫描列表中的文件进行处理,并将已扫描过的文件列表保存到文件中。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)