当前位置: 面试刷题>> 在系统中找到重复文件 (经典算法题500道)
### 题目描述补充
题目:在系统中找到重复文件
**问题描述**:
给定一个包含多个文件和文件夹的目录路径,你需要编写一个程序来找出该目录下所有重复的文件(即内容相同的文件,但文件名或路径可能不同)。程序需要输出每组重复文件的路径列表。注意,文件大小相同并不足以判断文件内容相同,必须实际比较文件内容。
**输入**:
- 一个目录路径(字符串)
**输出**:
- 一个字典或类似结构,键为文件内容的哈希值(用于标识重复的文件组),值为包含该文件内容的所有文件路径的列表。
### 示例代码
#### PHP 示例
```php
1) {
$duplicates[$hash] = $fileHashes[$hash];
}
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterator as $splFileInfo) {
if ($splFileInfo->isFile()) {
hashAndAddFile($splFileInfo->getRealPath());
}
}
return $duplicates;
}
// 示例用法
$directoryPath = "/path/to/directory";
$duplicates = findDuplicateFiles($directoryPath);
print_r($duplicates);
?>
```
#### Python 示例
```python
import hashlib
import os
from collections import defaultdict
def find_duplicate_files(directory):
duplicates = defaultdict(list)
def hash_and_add_file(file_path):
hasher = hashlib.sha256()
with open(file_path, 'rb') as f:
buf = f.read()
hasher.update(buf)
file_hash = hasher.hexdigest()
duplicates[file_hash].append(file_path)
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
hash_and_add_file(file_path)
return {k: v for k, v in duplicates.items() if len(v) > 1}
# 示例用法
directory_path = "/path/to/directory"
duplicates = find_duplicate_files(directory_path)
print(duplicates)
```
#### JavaScript 示例(Node.js)
```javascript
const fs = require('fs');
const crypto = require('crypto');
const path = require('path');
function findDuplicateFiles(directory) {
const duplicates = {};
function hashAndAddFile(filePath) {
const hash = crypto.createHash('sha256');
const stream = fs.createReadStream(filePath);
stream.on('data', (chunk) => {
hash.update(chunk);
});
stream.on('end', () => {
const fileHash = hash.digest('hex');
if (!duplicates[fileHash]) {
duplicates[fileHash] = [];
}
duplicates[fileHash].push(filePath);
if (duplicates[fileHash].length > 1) {
console.log(`Found duplicate: ${duplicates[fileHash]}`);
}
});
stream.on('error', (err) => {
console.error(`Error reading file: ${filePath}`, err);
});
}
fs.readdir(directory, { withFileTypes: true }, (err, entries) => {
if (err) throw err;
const files = entries.filter(entry => entry.isFile());
files.forEach(file => {
const filePath = path.join(directory, file.name);
hashAndAddFile(filePath);
});
});
// 注意:由于异步处理,这里不会直接返回 duplicates 对象
// 实际使用时,可能需要通过回调函数或Promise来处理结果
}
// 示例用法(注意:这里不会直接打印结果,因为fs.readdir是异步的)
const directoryPath = "/path/to/directory";
findDuplicateFiles(directoryPath);
// 码小课网站中有更多相关内容分享给大家学习
```
请注意,JavaScript 示例中由于文件读取是异步的,因此直接返回 `duplicates` 对象并不现实。在实际应用中,你可能需要通过回调函数、Promise 或 async/await 来处理异步结果。