文件遍历(C++)

(一)单层文件夹内容遍历(二)
摘要由CSDN通过智能技术生成

(一)遍历单层文件夹

//遍历文件夹,并输出文件夹下所有文件
void TraversalFolder(string folderPath)
{
    _finddata_t fileInfo;
    string fileName = folderPath + "\\*.*";

    static char str_time[100];
    struct tm *file_create_time = NULL;
    // 第一次查找
    long fileHandle = _findfirst(fileName.c_str(), &fileInfo);

    if(fileHandle == -1L){
        cout << "Failed to transfer files!" << endl;
        return;
    }

    //循环查找符合条件的文件
    do{
        file_create_time = gmtime(&fileInfo.time_create);
        strftime(str_time, sizeof(str_time), "%Y-%m-%d,%H:%M:%S", file_create_time);
        //输出找到的文件的文件名、创建时间、文件大小
        cout << fileInfo.name << " " << str_time << " " << fileInfo.size << endl;
    }while( _findnext(fileHandle, &fileInfo)==0 );

    _findclose(fileHandle);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的NTFS文件系统文件索引遍历C代码实现: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define BUFFER_SIZE 4096 void traverseIndex(HANDLE hVolume, PNTFS_VOLUME_DATA_BUFFER ntfsVolData, ULONGLONG indexStart); int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <drive_letter>:\n", argv[0]); return 1; } char szVolumeName[8]; sprintf(szVolumeName, "\\\\.\\%s:", argv[1]); HANDLE hVolume = CreateFile(szVolumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hVolume == INVALID_HANDLE_VALUE) { printf("Failed to open volume %s\n", szVolumeName); return 1; } NTFS_VOLUME_DATA_BUFFER ntfsVolData; DWORD dwBytesReturned; if (!DeviceIoControl(hVolume, FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsVolData, sizeof(ntfsVolData), &dwBytesReturned, NULL)) { printf("Failed to get NTFS volume data for %s\n", szVolumeName); CloseHandle(hVolume); return 1; } ULONGLONG indexStart = ntfsVolData.MftStartLcn * ntfsVolData.BytesPerSector; traverseIndex(hVolume, &ntfsVolData, indexStart); CloseHandle(hVolume); return 0; } void traverseIndex(HANDLE hVolume, PNTFS_VOLUME_DATA_BUFFER ntfsVolData, ULONGLONG indexStart) { BYTE *buffer = (BYTE*)malloc(BUFFER_SIZE); LARGE_INTEGER liOffset; liOffset.QuadPart = indexStart; DWORD dwBytesRead; if (!SetFilePointerEx(hVolume, liOffset, NULL, FILE_BEGIN) || !ReadFile(hVolume, buffer, BUFFER_SIZE, &dwBytesRead, NULL)) { printf("Failed to read from index at 0x%llx\n", indexStart); free(buffer); return; } PFILE_RECORD_HEADER pFrh = (PFILE_RECORD_HEADER)buffer; while (pFrh->Type != FILE_RECORD_TYPE_END && pFrh->Type != FILE_RECORD_TYPE_IN_USE) { if (pFrh->Type == FILE_RECORD_TYPE_UNUSED) { pFrh = (PFILE_RECORD_HEADER)((BYTE*)pFrh + ntfsVolData->BytesPerFileRecordSegment); continue; } PFILENAME_ATTRIBUTE pFileName = (PFILENAME_ATTRIBUTE)((BYTE*)pFrh + pFrh->FirstAttributeOffset); while ((BYTE*)pFileName < buffer + ntfsVolData->BytesPerFileRecordSegment && pFileName->Type != ATTRIBUTE_END) { if (pFileName->Type == ATTRIBUTE_FILENAME && pFileName->NameLength > 0) { WCHAR szName[pFileName->NameLength / 2 + 1]; memset(szName, 0, sizeof(szName)); MultiByteToWideChar(CP_UTF8, 0, (char*)pFileName + pFileName->NameOffset, pFileName->NameLength, szName, pFileName->NameLength / 2); printf("%ls\n", szName); } pFileName = (PFILENAME_ATTRIBUTE)((BYTE*)pFileName + pFileName->RecordLength); } pFrh = (PFILE_RECORD_HEADER)((BYTE*)pFrh + pFrh->RecordLength); } free(buffer); } ``` 此代码首先打开指定驱动器的NTFS卷,并获取卷数据。然后,它从MFT的起始位置开始遍历文件记录,找到包含文件名的文件名属性,然后输出文件名。输出的文件名为Unicode格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值