c++ 代码中 HANDLE 遍历指定路径下所有 文件夹以及所有文件,还有子文件夹中所有文件夹及所有文件并把它们复制到指定的路径中
时间: 2024-05-03 20:23:05 浏览: 99
以下是一个基于 Windows API 的 C 代码示例,可以遍历指定路径下所有文件夹和文件,并递归地遍历子文件夹中的所有文件夹和文件,并将它们复制到指定路径中:
```c
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
// 复制文件
BOOL CopyFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
{
BOOL bSuccess = FALSE;
HANDLE hExistingFile = NULL, hNewFile = NULL;
// 打开现有文件
hExistingFile = CreateFile(lpExistingFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hExistingFile == INVALID_HANDLE_VALUE)
{
printf("Failed to open existing file: %s\n", lpExistingFileName);
goto Exit;
}
// 创建新文件
hNewFile = CreateFile(lpNewFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hNewFile == INVALID_HANDLE_VALUE)
{
printf("Failed to create new file: %s\n", lpNewFileName);
goto Exit;
}
// 复制文件内容
DWORD dwBytesRead = 0, dwBytesWritten = 0;
BYTE buffer[4096];
while (ReadFile(hExistingFile, buffer, sizeof(buffer), &dwBytesRead, NULL) && dwBytesRead > 0)
{
if (!WriteFile(hNewFile, buffer, dwBytesRead, &dwBytesWritten, NULL) || dwBytesWritten != dwBytesRead)
{
printf("Failed to write to new file: %s\n", lpNewFileName);
goto Exit;
}
}
bSuccess = TRUE;
Exit:
if (hExistingFile != NULL) CloseHandle(hExistingFile);
if (hNewFile != NULL) CloseHandle(hNewFile);
return bSuccess;
}
// 遍历文件夹
void TraverseDirectory(LPCTSTR lpDirectory, LPCTSTR lpTargetDirectory)
{
HANDLE hFindFile = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA FindFileData;
TCHAR szFileName[MAX_PATH];
// 构造要搜索的路径
_tcscpy_s(szFileName, MAX_PATH, lpDirectory);
_tcscat_s(szFileName, MAX_PATH, _T("\\*"));
// 开始搜索文件
hFindFile = FindFirstFile(szFileName, &FindFileData);
if (hFindFile == INVALID_HANDLE_VALUE)
{
printf("Failed to find first file: %s\n", lpDirectory);
return;
}
do {
// 忽略 "." 和 ".."
if (_tcscmp(FindFileData.cFileName, _T(".")) == 0 || _tcscmp(FindFileData.cFileName, _T("..")) == 0) continue;
// 构造文件的全路径
_tcscpy_s(szFileName, MAX_PATH, lpDirectory);
_tcscat_s(szFileName, MAX_PATH, _T("\\"));
_tcscat_s(szFileName, MAX_PATH, FindFileData.cFileName);
// 如果是文件夹,则递归遍历子文件夹
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TraverseDirectory(szFileName, lpTargetDirectory);
}
else // 如果是文件,则复制到目标路径
{
TCHAR szTargetFileName[MAX_PATH];
_tcscpy_s(szTargetFileName, MAX_PATH, lpTargetDirectory);
_tcscat_s(szTargetFileName, MAX_PATH, _T("\\"));
_tcscat_s(szTargetFileName, MAX_PATH, FindFileData.cFileName);
if (CopyFileEx(szFileName, szTargetFileName))
{
printf("Copied file: %s -> %s\n", szFileName, szTargetFileName);
}
else
{
printf("Failed to copy file: %s -> %s\n", szFileName, szTargetFileName);
}
}
} while (FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
int _tmain(int argc, _TCHAR* argv[])
{
if (argc != 3)
{
printf("Usage: %s <source directory> <target directory>\n", argv[0]);
return 1;
}
TraverseDirectory(argv[1], argv[2]);
return 0;
}
```
该代码使用了两个函数:
- `TraverseDirectory`:遍历指定路径下的所有文件和文件夹,并递归地遍历子文件夹中的所有文件和文件夹,将文件复制到指定路径中。
- `CopyFileEx`:复制文件。
在 `TraverseDirectory` 函数中,使用了 `FindFirstFile` 和 `FindNextFile` 函数遍历文件夹,对于每个文件夹,递归调用 `TraverseDirectory` 函数;对于每个文件,调用 `CopyFileEx` 函数将其复制到指定路径中。在 `CopyFileEx` 函数中,使用了 `CreateFile`、`ReadFile` 和 `WriteFile` 函数进行文件操作。
注意:该代码仅在 Windows 平台上可用,因为它使用了 Windows API。如果要在其他平台上运行,需要使用相应的 API 或库进行文件操作。
阅读全文