`
- 浏览:
118826 次
- 性别:
- 来自:
北京
-
1#define _WIN32_WINNT 0x0400
2#include <windows.h>
3#include <winioctl.h>
4//ReadFileLink
5ULONGLONG *GetFileClusters(
6 PCHAR lpFileName,
7 ULONG *ClusterSize,
8 ULONG *ClCount,
9 ULONG *FileSize
10 )
11{
12 HANDLE hFile;
13 ULONG OutSize;
14 ULONG Bytes, Cls, CnCount, r;
15 ULONGLONG *Clusters = NULL;
16 BOOLEAN Result = FALSE;
17 LARGE_INTEGER PrevVCN, Lcn;
18 STARTING_VCN_INPUT_BUFFER InBuf;
19 PRETRIEVAL_POINTERS_BUFFER OutBuf;
20 CHAR Name[7];
21
22 Name[0] = lpSrcName[0];
23 Name[1] = ':';
24 Name[2] = 0;
25
26 GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL);
27
28 ClusterSize = SecPerCl * BtPerSec;
29
30 hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
31 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
32 NULL, OPEN_EXISTING, 0, 0);
33
34 if (hFile != INVALID_HANDLE_VALUE)
35 {
36 *FileSize = GetFileSize(hFile, NULL);
37
38 OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents);
39
40 OutBuf = malloc(OutSize);
41
42 InBuf.StartingVcn.QuadPart = 0;
43
44 if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
45 sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
46 {
47 *ClCount = (*FileSize + ClusterSize - 1) / ClusterSize;
48
49 Clusters = malloc(*ClCount * sizeof(ULONGLONG));
50
51 PrevVCN = OutBuf->StartingVcn;
52
53 for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++)
54 {
55 Lcn = OutBuf->Extents[r].Lcn;
56
57 for (CnCount = (ULONG)(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart);
58 CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart;
59
60 PrevVCN = OutBuf->Extents[r].NextVcn;
61 }
62 }
63
64 free(OutBuf);
65
66 CloseHandle(hFile);
67 }
68 return Clusters;
69}
70
71//how do we use the clusters
72void Read(
73 PCHAR lpSrcName
74 )
75{
76 ULONG ClusterSize, BlockSize;
77 ULONGLONG *Clusters;
78 ULONG ClCount, FileSize, Bytes;
79 HANDLE hDrive, hFile;
80 ULONG SecPerCl, BtPerSec, r;
81 PVOID Buff;
82 LARGE_INTEGER Offset;
83 CHAR Name[7];
84
85 Clusters = GetFileClusters(lpSrcName, &ClusterSize, &ClCount, &FileSize);
86
87 if (Clusters)
88 {
89 Name[0] = '\\';
90 Name[1] = '\\';
91 Name[2] = '.';
92 Name[3] = '\\';
93 Name[4] = lpSrcName[0];
94 Name[5] = ':';
95 Name[6] = 0;
96
97 hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
98
99 if (hDrive != INVALID_HANDLE_VALUE)
100 {
101
102 Buff = malloc(ClusterSize);
103
104 for (r = 0; r < ClCount; r++, FileSize -= BlockSize)
105 {
106 Offset.QuadPart = ClusterSize * Clusters[r];
107
108 SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);
109
110 ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);
111
112 BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;
113
114 }
115
116 free(Buff);
117
118 CloseHandle(hDrive);
119 }
120 free(Clusters);
121 }
122}
123
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
这通常涉及到使用系统调用或库函数,如`opendir`、`readdir`和`closedir`等,在UNIX-like系统中,或使用Windows API的`FindFirstFile`和`FindNextFile`等在Windows系统中,来枚举目录下的文件和子目录,并将它们的...
4. **文件操作**:在处理API搜索文件时,可能会涉及到读取、解析和存储文件数据。这可能包括读取文本文件、XML文件或者数据库文件,以获取API的详细信息。 5. **错误处理**:任何编程项目都需要注意错误处理,确保...
总结起来,通过C#的文件读写API,我们可以高效地处理文件,构建行链表,解析文件内容,并进行相应的修改。理解这些基本操作是进行更复杂文件处理任务的基础,如日志分析、数据处理和文件格式转换等。在实际项目中,...
本文将深入探讨如何通过编程方式读取DXF文件,以实现数据的解析与处理。 首先,我们需要了解DXF文件的基本结构。DXF文件由多个段(sections)组成,包括HEADER、CLASSES、TABLES、BLOCKS、ENTITIES和ENDOFDWG。每个...
1. **读取配置文件**:函数可能命名为`readIniFile`,它会打开一个`ini`文件,逐行读取内容,解析节和键值对,并将它们存储在一个数据结构中,如链表或哈希表,以便后续的查找和处理。 2. **创建数据结构**:为了...
在本项目中,我们将利用内核链表实现一个简单的学生管理系统,该系统能够创建、更新和读取存储在文件中的学生记录。 首先,我们需要了解内核链表的基本概念。内核链表是一种动态数据结构,它由一系列节点组成,每个...
本篇将详细讲解如何在mobile环境中封装一个ini文件的读取功能,以及如何处理由于SDK限制无法直接使用API函数的情况。 一、ini文件结构与内容 ini文件通常包含多个节(section)和键值对(key-value pairs)。每个节...
在Windows系统中,INI文件被广泛使用,但在Linux环境下,尽管没有内置的API专门处理INI文件,但可以通过标准C库函数或自定义解析器来实现读写操作。本项目提供了在Linux下用纯C语言读写INI文件的实现方法。 首先,...
C++ API 帮助文件是为初学者设计的一个资源,旨在提供关于C++编程语言中函数和其他关键概念的详细信息。C++是一门强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、应用软件以及嵌入式系统等领域。它的...
1. 读取bmp文件并创建`CBitmap`对象。 2. 将`CBitmap`对象存储在链表节点的数据成员中。 3. 确保添加操作检查输入图像是否为bmp格式,如果不是,则拒绝添加。 ### 实现注意事项 - 使用`AddNodeAtHead()`和`...
这涉及读取数据文件,将数据解析成链表结构,以及将链表结构写回文件。文件读写通常使用流式API,如C++的`fstream`库或Python的内置`open()`函数。解析数据时,可以采用CSV格式,其中每行代表一个运动员的成绩,包含...
反之,当启动程序时,系统会从文件中读取数据并加载到链表中。这样,即使程序退出,下次打开时仍能恢复之前的状态。 在实现过程中,可能需要处理的关键点包括:1) 文件的打开、读写和关闭操作;2) 链表节点的创建、...
在这个“动态链表数据库”项目中,开发者实现了一个跨平台的解决方案,能够运行在Windows(win32)和Linux操作系统上,这涉及到对不同操作系统API的理解和应用。 链表作为基础数据结构,它有别于数组,数组中的元素...
3. **文件的创建和删除**:操作系统提供API或命令行工具来创建和删除文件。创建文件时,操作系统会在磁盘上分配空间,并记录文件元数据,如文件名、大小、创建日期等。删除文件时,只是将文件的元数据标记为已删除,...
压缩包中的“简单UI框架链表结构易语言源码”文件应当包含了实现以上功能的全部代码。通过阅读和理解这些源码,我们可以学习到如何在易语言中构建链表结构,如何操作UI组件,以及如何利用Windows API进行窗口管理和...
读取MAC地址通常涉及到底层的网络编程,这在MFC中可以通过调用Win32 API函数来实现。关键的API函数是`GetAdaptersInfo()`或`GetAdaptersAddresses()`。这两个函数都属于Windows的IP Helper API,用于获取网络适配器...
`CFile`类提供了一种封装Windows API文件操作的方法,使得代码更易于理解和维护。例如,可以使用`Open`函数打开文件,`Write`函数写入数据,`Read`函数读取数据,以及`Close`函数关闭文件。 **链表**: 链表是一种...
每次启动系统时,可以读取txt文件将数据加载到链表中,退出时再将链表内容写回文件,以确保数据不丢失。在实际应用中,可能还需要考虑错误处理和数据校验,以防止数据损坏或不一致。 最后,"看不懂点这里.txt"可能...
6. 文件操作:创建、打开、读取、写入、关闭、移动、复制和删除文件是文件管理的基本操作。学生需要掌握各种编程语言中对应的API函数或方法。 7. 文件备份与恢复:理解备份策略(如增量备份、差异备份)和数据恢复...
10. 库的使用:源码库可能包含示例代码或API文档,指导如何在自己的项目中集成和使用这个库,如创建新的DXF文件、添加图形元素、读取现有文件等。 通过深入研究和理解这个源码库,开发者可以构建自己的DXF处理工具...