`
huangjun_mail
  • 浏览: 118826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

API读取文件链表&读取文件

阅读更多

 

  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, 00);
 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, 00);
 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

 

分享到:
评论

相关推荐

    典型小程序(读取DBF 文件,读取文件中整数并排序,鼠标应用,画图,文件系统中目录内容显示,链表插入操作)

    这通常涉及到使用系统调用或库函数,如`opendir`、`readdir`和`closedir`等,在UNIX-like系统中,或使用Windows API的`FindFirstFile`和`FindNextFile`等在Windows系统中,来枚举目录下的文件和子目录,并将它们的...

    API搜索文件.rar

    4. **文件操作**:在处理API搜索文件时,可能会涉及到读取、解析和存储文件数据。这可能包括读取文本文件、XML文件或者数据库文件,以获取API的详细信息。 5. **错误处理**:任何编程项目都需要注意错误处理,确保...

    对文件的读写操作,将文件读出形成行链表,根据文件的信息进行解析,修改文件内容.zip

    总结起来,通过C#的文件读写API,我们可以高效地处理文件,构建行链表,解析文件内容,并进行相应的修改。理解这些基本操作是进行更复杂文件处理任务的基础,如日志分析、数据处理和文件格式转换等。在实际项目中,...

    读取DXF文件

    本文将深入探讨如何通过编程方式读取DXF文件,以实现数据的解析与处理。 首先,我们需要了解DXF文件的基本结构。DXF文件由多个段(sections)组成,包括HEADER、CLASSES、TABLES、BLOCKS、ENTITIES和ENDOFDWG。每个...

    linux c,ini配置文件读写模块

    1. **读取配置文件**:函数可能命名为`readIniFile`,它会打开一个`ini`文件,逐行读取内容,解析节和键值对,并将它们存储在一个数据结构中,如链表或哈希表,以便后续的查找和处理。 2. **创建数据结构**:为了...

    内核链表 -- 学生管理系统

    在本项目中,我们将利用内核链表实现一个简单的学生管理系统,该系统能够创建、更新和读取存储在文件中的学生记录。 首先,我们需要了解内核链表的基本概念。内核链表是一种动态数据结构,它由一系列节点组成,每个...

    mobile中封装的ini文件的读取

    本篇将详细讲解如何在mobile环境中封装一个ini文件的读取功能,以及如何处理由于SDK限制无法直接使用API函数的情况。 一、ini文件结构与内容 ini文件通常包含多个节(section)和键值对(key-value pairs)。每个节...

    Linux 下读写 INI 的程序 (纯C语言)

    在Windows系统中,INI文件被广泛使用,但在Linux环境下,尽管没有内置的API专门处理INI文件,但可以通过标准C库函数或自定义解析器来实现读写操作。本项目提供了在Linux下用纯C语言读写INI文件的实现方法。 首先,...

    c++ API 帮助文件

    C++ API 帮助文件是为初学者设计的一个资源,旨在提供关于C++编程语言中函数和其他关键概念的详细信息。C++是一门强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、应用软件以及嵌入式系统等领域。它的...

    MFC链表源代码

    1. 读取bmp文件并创建`CBitmap`对象。 2. 将`CBitmap`对象存储在链表节点的数据成员中。 3. 确保添加操作检查输入图像是否为bmp格式,如果不是,则拒绝添加。 ### 实现注意事项 - 使用`AddNodeAtHead()`和`...

    用链表实现运动会分数统计

    这涉及读取数据文件,将数据解析成链表结构,以及将链表结构写回文件。文件读写通常使用流式API,如C++的`fstream`库或Python的内置`open()`函数。解析数据时,可以采用CSV格式,其中每行代表一个运动员的成绩,包含...

    人工智能-项目实践-信息管理系统-利用qt5框架实现的学生信息管理系统(文件存储,链表操作)

    反之,当启动程序时,系统会从文件中读取数据并加载到链表中。这样,即使程序退出,下次打开时仍能恢复之前的状态。 在实现过程中,可能需要处理的关键点包括:1) 文件的打开、读写和关闭操作;2) 链表节点的创建、...

    动态链表数据库(项目)

    在这个“动态链表数据库”项目中,开发者实现了一个跨平台的解决方案,能够运行在Windows(win32)和Linux操作系统上,这涉及到对不同操作系统API的理解和应用。 链表作为基础数据结构,它有别于数组,数组中的元素...

    操作系统 实验报告 文件管理

    3. **文件的创建和删除**:操作系统提供API或命令行工具来创建和删除文件。创建文件时,操作系统会在磁盘上分配空间,并记录文件元数据,如文件名、大小、创建日期等。删除文件时,只是将文件的元数据标记为已删除,...

    易语言简单UI框架链表结构

    压缩包中的“简单UI框架链表结构易语言源码”文件应当包含了实现以上功能的全部代码。通过阅读和理解这些源码,我们可以学习到如何在易语言中构建链表结构,如何操作UI组件,以及如何利用Windows API进行窗口管理和...

    读取电脑MAC地址

    读取MAC地址通常涉及到底层的网络编程,这在MFC中可以通过调用Win32 API函数来实现。关键的API函数是`GetAdaptersInfo()`或`GetAdaptersAddresses()`。这两个函数都属于Windows的IP Helper API,用于获取网络适配器...

    tongxunlu.rar_File类_Vc_tongxunlu_通讯录_链表

    `CFile`类提供了一种封装Windows API文件操作的方法,使得代码更易于理解和维护。例如,可以使用`Open`函数打开文件,`Write`函数写入数据,`Read`函数读取数据,以及`Close`函数关闭文件。 **链表**: 链表是一种...

    mfc课程设计 链表

    每次启动系统时,可以读取txt文件将数据加载到链表中,退出时再将链表内容写回文件,以确保数据不丢失。在实际应用中,可能还需要考虑错误处理和数据校验,以防止数据损坏或不一致。 最后,"看不懂点这里.txt"可能...

    课程设计-文件管理

    6. 文件操作:创建、打开、读取、写入、关闭、移动、复制和删除文件是文件管理的基本操作。学生需要掌握各种编程语言中对应的API函数或方法。 7. 文件备份与恢复:理解备份策略(如增量备份、差异备份)和数据恢复...

    dxf文件转换库源码

    10. 库的使用:源码库可能包含示例代码或API文档,指导如何在自己的项目中集成和使用这个库,如创建新的DXF文件、添加图形元素、读取现有文件等。 通过深入研究和理解这个源码库,开发者可以构建自己的DXF处理工具...

Global site tag (gtag.js) - Google Analytics