文件IO操作笔记

来源:互联网 发布:ea软件下载 编辑:程序博客网 时间:2024/05/01 02:26

invoke CreateFile, lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition,

dwFlagsAndAttributes, hTemplateFile


lpFileName 文件名
dwDesiredAccss 存储方式
    GENERIC_READ 读方式打开
    GENERIC_WRITE 写方式打开
dwShareMode 共享属性
    0 打开后不允许文件再被打开
    FILE_SHARE_READ, 允许文件再被"读"方式打开
    FILE_SHARE_WRITE 允许文件再被"写"方式打开
lpSecurityAttributes 安全属性
    NULL 资源无法被子进程继承
    指向SECURITY_ATTRIBUTES结构体指针
        SECURITY_ATTRIBUTES {
            nLength 本结构的长度
            lpSecurityDescriptor
            bInheritHandle 是否允许继承
        }
dwCreationDisposition 文件存在与否时系统的动作
    CREATE_NEW 创建新文件, 如果文件已经存在, 函数会返回失败
    CREATE_ALWAYS 创建新文件, 如果文件已经存在则清除原文件
    OPEN_EXISTING 打开存在的文件, 当文件不存在时函数会返回失败
    OPEN_ALWAYS 如果文件已经存在, 则打开, 不存在则创建新文件
    TRUNCATE_EXISTING 打开文件并将文件截断为0, 当文件不存在时返回失败
dwFlagsAndAttributes 参数用来指定新建文件的属性, 文件属性可以是下面这些值的组合:
    FILE_ATTRIBUTE_NORMAL 普通文件, 设置这个属性时其它属性都不会生效
    FILE_ATTRIBUTE_ARCHIVE 设置归档属性
    FILE_ATTRIBUTE_HIDDEN 设置隐藏属性
    FILE_ATTRIBUTE_READONLY 设置只读属性
    FILE_ATTRIBUTE_SYSTEM 设置系统属性
    FILE_ATTRIBUTE_TERMPORARY 临时文件, 系统会尽量把所有的文件内容保持在内存中以加快存取速度, 程序在不再使用文件

的时候需要尽快将它删除

    此外该参数还可同时指定对文件操作的方式, 常用的方式有:
        FILE_FLAG)WRITE_THROUGH 使用WriteThrough模式, 系统不会对文件使用缓存, 文件的改变马上会被写到磁盘中
        FILE_FLAG_OVERLAPPED 使用异步文件操作模式
        FILE_FLAG_DELETE_ON_CLOSE 文件被关闭后立即被系统自动删除
        FILE_FLAG_RANDOM_ACCESS 对文件进行随机读写操作(操作系统对文件的缓存进行优化)

hTemplateFile 指定了一个文件模板的句柄, 该文件模板的所有属性都会被复制到当前创建的文件中, 可为NULL

 

当打开文件成功时, 函数返回值是文件句柄, 失败的话, 返回INVALID_HANDLE_VALUE(-1)

关闭一个文件, 可以用CloseHandle, hFile

调整文件指针使用SetFilePointer函数
invoke SetFilePointer, hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod
返回值是用CreateFile函数返回的文件句柄, 失败返回-1

lDistanceToMove
    指定要移动的距离

lpDistanceToMoveHigh
    是一个指针, 指向32位变量, 存放移动距离高32位,
    tanceToMove中的32位一起组成一个64位距离(一般设置为NULL)
dwMoveMethod
    指定了移动的模式, 也就是指明从什么地方开始移动, 它可以是以下的取值:
        FILE_BEGIN 从文件头部开始移动
        FILE_CURRENT 从当前的文件指针处开始移动
        FILE_END 从文件尾开始移动

invoke SetEndOfFile, hFile
    将文件的长度调整到当前的文件指针指向的长度, 有截断文件的功能


读写文件
invoke ReadFile, hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped
失败返回0, 成功返回非0

hFile 文件句柄
lpBuffer 指向一个缓冲区, 函数将读出的数据传送到这里
nNumberOfBytesToRead 指定需要读入的字节数
lpNumberOfBytesRead 实际读入的字节数
lpOverlapped指向一个OVERLAPPED结构, 供函数在异步读取文件时使用, 同步时为该处为NULL

invoke WriteFile, hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped

FlushFileBuffers清空数据缓冲区
invoke FlushFileBuffers, hFile
成功返回非0, 失败返回0
就把缓冲区的数据写到文件中去, 以防止数据意外丢失

为防止共享冲突, 有文件加锁解锁函数

invoke LockFile, hFile, dwFileOffsetLow, dwFileOffsetHigh,
                 nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh
invoke UnlockFile, hFile, dwFileOffsetLow, dwFileOffsetHigh,
                 nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh

dwFileOffsetLow 和 dwFileOffsetHight 参数组合起来指定了加锁区域的开始位置
dwNumberOfBytesToLockLow 和 dwNumberOfBytesToLockHight 参数组合起来则指定加锁区域的大小
这两组参数都指定了64位的值, 在WINDOWS中, 可以只用低32位

 

 

写文件Demo

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    //打开d盘下的test.txt, 若没有test.txt, 则新建后打开, 以写的方式打开
    HANDLE hFile = CreateFile("d://test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, TEXT("CreateFile Error!"), TEXT("Error"), MB_OK | MB_ICONINFORMATION);
        return -1;
    }

    TCHAR    szBuffer[1024] = {"Ren"};
    DWORD    size;

    WriteFile(hFile, szBuffer, lstrlen(szBuffer), &size, NULL);
    FlushFileBuffers(hFile);

    CloseHandle(hFile);
    return 0;
}

 

 

 

 

 

读文件Demo

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    //打开d盘下的test.txt并读取数据显示出来
    HANDLE hFile = CreateFile("d://test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, TEXT("CreateFile Error!"), TEXT("Error"), MB_OK | MB_ICONINFORMATION);
        return -1;
    }

    BYTE    ch[2];
    TCHAR    szBuffer[10240] = {0};
    DWORD    size;

    while (ReadFile(hFile, ch, 1, &size, NULL) & size)
    {
        FlushFileBuffers(hFile);
        ch[1] = 0;
        lstrcat(szBuffer, (LPSTR)ch);
    }

    MessageBox(NULL, (LPSTR)szBuffer, "", 0);

    CloseHandle(hFile);
    return 0;
}