代码改变世界

WindowsAPI进行文件操作(同步模式)

2012-12-20 02:00  kennyMc  阅读(1737)  评论(0编辑  收藏  举报

先用同步模式来进行文件的写入操作

#include <iostream>
#include<locale.h>
#include <process.h>
#include <windows.h>
#include <string>
#include <WCHAR.H>
using std::cout;
using std::endl;
using std::string;

int main()
{
    char *str="测试写入文件,HELLO KENNY";
    cout<<"写入文件内容:"<<str<<endl;

    ///------------------------------
    ///CreateFile函数创建文件
    ///------------------------------
    HANDLE hFile=CreateFile("C:\\test.txt",
        GENERIC_WRITE|GENERIC_READ,//读写权限
        0,//独占对设备的访问
        NULL,//默认安全设置
        CREATE_ALWAYS,//始终创建
        FILE_ATTRIBUTE_NORMAL,//正常属性
        NULL//空文件模版
        );

    //注意这里如果调用设置失败返回的是INVALID_HANDLE_VALUE
    if(hFile==INVALID_HANDLE_VALUE)
    {
        cout<<"ERROR:创建文件失败"<<endl;
        system("PAUSE");
        return 1;
    }

    ///------------------------------
    ///WriteFile函数将字符写入文件
    ///------------------------------
    //写入文件字节数
    DWORD writeByte=0;
    ////设置文件编码头(Unicode编码)UTF-8:EFBBBF,UTF-16(BE)FEFF,UTF-16(LE):FFFE
    ////编码BOM参考:http://blog.csdn.net/lipeijs3/article/details/5062243
    //WORD UnicodeId =0xFEFF;

    //WriteFile(hFile,&UnicodeId,sizeof(UnicodeId),&writeByte,NULL);
    //注意:str是指针,无法字节sizeof获取字符字节数
    if(!WriteFile(hFile,str,strlen(str)*sizeof(char),&writeByte,NULL))
    {
        cout<<"ERROR:写入文件失败"<<endl;
        system("PAUSE");
        return 1;
    }
    cout<<"成功写入:"<<writeByte<<" byte"<<endl;
    //将缓冲区内容写入硬盘
    FlushFileBuffers(hFile);

    ///------------------------------
    ///GetFileSizeEx函数获得文件大小
    ///------------------------------
    LARGE_INTEGER lar;
    if(!GetFileSizeEx(hFile,&lar))
    {
        cout<<"ERROR:读取文件大小失败"<<endl;
        system("PAUSE");
        return 1;
    }
    cout<<"FileSize:"<<lar.QuadPart<<" byte"<<endl;

    ///------------------------------
    ///销毁资源
    ///------------------------------
    CloseHandle(hFile);
    system("PAUSE");
    return 0;
}

 

同步模式下的文件读取

#include <iostream>
#include<locale.h>
#include <process.h>
#include <windows.h>
#include <string>
#include <WCHAR.H>
using std::cout;
using std::endl;
using std::string;

int main()
{
    ///------------------------------
    ///CreateFile函数创建文件
    ///------------------------------
    HANDLE hFile=CreateFile("C:\\test.txt",
        GENERIC_WRITE|GENERIC_READ,//读写权限
        0,//独占对设备的访问
        NULL,//默认安全设置
        OPEN_ALWAYS,//始终打开
        FILE_ATTRIBUTE_NORMAL,//正常属性
        NULL//空文件模版
        );

    //注意这里如果调用设置失败返回的是INVALID_HANDLE_VALUE
    if(hFile==INVALID_HANDLE_VALUE)
    {
        cout<<"ERROR:创建文件失败"<<endl;
        system("PAUSE");
        return 1;
    }

    ///------------------------------
    ///GetFileSizeEx函数获得文件大小
    ///------------------------------
    LARGE_INTEGER lar;
    if(!GetFileSizeEx(hFile,&lar))
    {
        cout<<"ERROR:读取文件大小失败"<<endl;
        system("PAUSE");
        return 1;
    }
    cout<<"FileSize:"<<lar.QuadPart<<" byte"<<endl;

    ///------------------------------
    ///SetFilePointer函数设置文件指针
    ///------------------------------
    //hFile内核对象中有一个(64位偏移量)文件指针,默认设置为0
    //可以手动使用SetFilePointerEx函数来设置文件指针
    LARGE_INTEGER _dtm={0};//从位置0开始读取
    if(!SetFilePointerEx(hFile,_dtm,&_dtm,FILE_CURRENT))
    {
        cout<<"ERROR:设置文件指针失败"<<endl;
        system("PAUSE");
        return 1;
    }
    cout<<"文件指针:"<<_dtm.QuadPart<<endl;

    //读取的字节数
    DWORD dwReadSize=0;
    //读取缓冲区
    char *chBuffer=new char[1024];
    //将缓冲区元素初始化为0
    memset(chBuffer,0,1024);
    if(!ReadFile(hFile,chBuffer,lar.QuadPart,&dwReadSize,NULL))
    {
       cout<<"ERROR:读取文件失败"<<endl;
       cout<<"CODE:"<<GetLastError()<<endl;
    }
    cout<<"读取字节:"<<dwReadSize<<" byte"<<endl;
    cout<<chBuffer<<endl;

    ///------------------------------
    ///销毁资源
    ///------------------------------
    CloseHandle(hFile);
    delete []chBuffer;
    system("PAUSE");
    return 0;
}

 

这里只是简单的测试API方法,未考虑文件编码格式和大文件的处理,c,c++下的编码处理比NET复杂,所以先把这些细节实现放下,先抓重点,这篇文章是为Windows核心编程中的异步做准备。

本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。