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

 

  1 #define  _WIN32_WINNT 0x0400
  2 #include  < windows.h >
  3 #include  < winioctl.h >
  4 // ReadFileLink
  5 ULONGLONG  * 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
 72 void  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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
读取UCI文件的API可以使用以下步骤: 1. 打开文件并读取内容。 2. 逐行读取文件内容并将其存储在字符串数组中。 3. 遍历字符串数组并解析每个属性及其值。 4. 将属性及其值存储在适当的数据结构中,例如链表或哈希表。 5. 关闭文件并返回数据结构。 以下是一个简单的示例代码,用于读取名为input.uci的UCI文件中的数据并将其存储在链表中: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 256 typedef struct uci_property { char *name; char *value; struct uci_property *next; } uci_property_t; uci_property_t *uci_read_file(char *filename) { FILE *fp; char line[MAX_LINE_LEN]; char *name, *value; uci_property_t *head = NULL, *tail = NULL, *prop; // Open file for reading fp = fopen(filename, "r"); if (fp == NULL) { printf("Failed to open file %s\n", filename); return NULL; } // Loop over lines in file while (fgets(line, MAX_LINE_LEN, fp) != NULL) { // Remove trailing newline character line[strcspn(line, "\n")] = '\0'; // Split line into name and value name = strtok(line, " "); value = strtok(NULL, " "); // Allocate new property prop = (uci_property_t *)malloc(sizeof(uci_property_t)); prop->name = strdup(name); prop->value = strdup(value); prop->next = NULL; // Add property to linked list if (tail == NULL) { head = tail = prop; } else { tail->next = prop; tail = prop; } } // Close file fclose(fp); return head; } int main() { uci_property_t *props, *prop; // Read UCI file props = uci_read_file("input.uci"); // Print properties for (prop = props; prop != NULL; prop = prop->next) { printf("%s = %s\n", prop->name, prop->value); } // Free memory for (prop = props; prop != NULL; prop = prop->next) { free(prop->name); free(prop->value); free(prop); } return 0; } ``` 该例程使用fgets()函数逐行读取文件内容,并使用strtok()函数将每一行拆分成属性名和属性值。然后,它将每个属性及其值存储在一个链表中,并在读取完整个文件后返回该链表。最后,它遍历链表并打印每个属性及其值,并释放链表中的所有内存。 请注意,该示例代码没有进行错误检查,例如检查属性名和属性值是否为NULL。在实际应用中,您应该添加适当的错误检查来确保代码的稳健性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值