直接读取扇区来拷贝文件的例子
来源:互联网 发布:兵器推演软件 编辑:程序博客网 时间:2024/05/21 10:10
使用函数
DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
就可以查询文件的簇链
下面是个例如直接读取扇区来拷贝文件的例子
用法:FileCopy("C://boot.ini", "D://boot.ini");
- C/C++ code
- ULONGLONG *GetFileClusters( LPCSTR lpFileName, ULONG ClusterSize, ULONG *ClCount, ULONG *FileSize ){ HANDLE hFile; ULONG OutSize; ULONG Bytes, Cls, CnCount, r; ULONGLONG *Clusters = NULL; BOOLEAN Result = FALSE; LARGE_INTEGER PrevVCN, Lcn; STARTING_VCN_INPUT_BUFFER InBuf; PRETRIEVAL_POINTERS_BUFFER OutBuf; hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0); if (hFile != INVALID_HANDLE_VALUE) { *FileSize = GetFileSize(hFile, NULL); OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents); OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize); InBuf.StartingVcn.QuadPart = 0; if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf, sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL)) { *ClCount = (*FileSize + ClusterSize - 1) / ClusterSize; Clusters = (PULONGLONG)malloc(*ClCount * sizeof(ULONGLONG)); PrevVCN = OutBuf->StartingVcn; for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++) { Lcn = OutBuf->Extents[r].Lcn; for (CnCount = (ULONG)(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart); CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart; PrevVCN = OutBuf->Extents[r].NextVcn; } } free(OutBuf); CloseHandle(hFile); } return Clusters;}BOOL FileCopy(LPCSTR lpSrcName, LPCSTR lpDstName){ BOOL bResult = FALSE; ULONG ClusterSize, BlockSize; ULONGLONG *Clusters; ULONG ClCount, FileSize, Bytes; HANDLE hDrive, hFile; ULONG SecPerCl, BtPerSec, r; PVOID Buff; LARGE_INTEGER Offset; CHAR Name[7]; Name[0] = lpSrcName[0]; Name[1] = ':'; Name[2] = 0; GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL); ClusterSize = SecPerCl * BtPerSec; Clusters = GetFileClusters(lpSrcName, ClusterSize, &ClCount, &FileSize); if(Clusters) { Name[0] = '//'; Name[1] = '//'; Name[2] = '.'; Name[3] = '//'; Name[4] = lpSrcName[0]; Name[5] = ':'; Name[6] = 0; hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); if (hDrive != INVALID_HANDLE_VALUE) { hFile = CreateFile(lpDstName, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0); if (hFile != INVALID_HANDLE_VALUE) { Buff = malloc(ClusterSize); for (r = 0; r < ClCount; r++, FileSize -= BlockSize) { Offset.QuadPart = ClusterSize * Clusters[r]; SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN); ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL); BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize; WriteFile(hFile, Buff, BlockSize, &Bytes, NULL); } free(Buff); CloseHandle(hFile); bResult = TRUE; } CloseHandle(hDrive); } free(Clusters); } else { printf("GetFileClusters fail./n"); } return bResult;}
- 直接读取扇区来拷贝文件的例子
- 通过CreateFile来读取磁盘扇区的方法
- 通过扇区读取文件内容
- windows sdk编程系列文章 --- 直接从硬盘扇区读取文件内容
- 通过文件的拷贝例子,来详解文件资源的正确关闭的两种方法
- 每日MySQL之025:InnoDB,直接拷贝文件来实现表的复制
- 文件的读取&拷贝
- DeviceIoControl 直接从磁盘扇区读文件
- DeviceIoControl 直接从磁盘扇区读文件
- 读取硬盘扇区的数据
- 直接写入硬盘的第一扇区
- 通过文件的方式对硬盘扇区进行直接读写操作
- JSP读取文件的例子。
- 读取properties文件的例子.
- 收录一个拷贝文件的经典例子
- 读取光驱上的指定扇区
- 读取软盘逻辑扇区的汇编过程
- 磁盘扇区数据的读取和写入
- linux 2.6 内核的调度程序分析
- Android 的属性系统
- 甘特图框架介绍
- 烦
- 信长,强者的豁达
- 直接读取扇区来拷贝文件的例子
- 将pjsip的python扩展从python2.4升级到python3.2
- jdbc 反射
- PHP MVC代码分析(小凯教你写一个MVC框架)
- ERP系统2011.5.26更新记录
- 在SHELL中执行MYSQL语句
- [想法征集]我心中理想的博客系统
- 一个多文件上传的 简单JS
- CATIA中的DMU功能