Windows编程中各种操作文件的方法

windows编程中文件操作有以下几种常见方法:

1.C语言中文件操作。
2.C++语言中的文件操作。
3.Win32 API函数文件操作。
4.MFC CFile类文件操作。
5.MFC CFileDialog类的文件操作。
6.注册表文件操作。

下面我来详细说明一下各种文件操作方法:
1. C语言中文件操作.需要包含的头文件stdio.h

写入文件:
FILE *pfile=fopen("C.txt","w");//以写的方式打开C.txt文件。   
fwrite("Welcome to VCFans!",1,strlen("Welcome to VCFans!"),pfile);//将数据写入文件。   
fflush(pfile);//刷新缓冲区。将缓冲区数据写入文件   
fclose(pfile);//关闭文件   

 
    
读取文件:   
FILE *pfile=fopen("C.txt","r");//以读的方式打开C.txt文件。   
char FileContent[100];   
memset(FileContent,0,100);//初始化FileContent   
fread(FileContent,1,100,pfile);//将刚才C.txt文件中的内容读入到FileContent   
MessageBox(FileContent);//输出结果   
fclose(pfile);//关闭文件  

2.C++语言中的文件操作。需要包含的头文件fstream.h
    

写入文件:   
ofstream ofs("C++.txt");//建立ofstream对像。   
ofs.write("Welcome to VCFans!",strlen("Welcome to VCFans!"));//将数据写入文件   
ofs.close();//关闭ofstream对象。   
读取文件:   
ifstream ifs("C++.txt");   
char FileContent[100];   
memset(FileContent,0,100);//初始化FileContent   
ifs.read(FileContent,100);//读取数据   
ifs.close();//关闭ifstream对像   
MessageBox(FileContent);//输出结果   

3.Win32 API函数文件操作。需要包含的头文件winbase.h,需要类库:kernel32.lib

写入文件:   
HANDLE hFile;//定义一个句柄。   
hFile=CreateFile("API.txt",   
                 GENERIC_WRITE,   
                 FILE_SHARE_WRITE,   
                 NULL,   
                 CREATE_NEW,   
                 FILE_ATTRIBUTE_NORMAL,   
                 NULL);//使用CreatFile这个API函数打开文件   
DWORD Written;   
WriteFile(hFile,"Welcome to VCFans!",strlen("Welcome to VCFans!"),&Written,NULL);//写入文件   
CloseHandle(hFile);//关闭句柄   
读取文件:   
HANDLE hFile;//定义一个句柄。   
hFile=CreateFile("API.txt",   
                 GENERIC_READ,   
                 FILE_SHARE_READ,   
                 NULL,   
                 OPEN_EXISTING,   
                 FILE_ATTRIBUTE_NORMAL,   
                 NULL);//使用CreatFile这个API函数打开文件   
DWORD dwDataLen;   
char FileContent[100];   
ReadFile(hFile,FileContent,100,&dwDataLen,NULL);//读取数据   
FileContent[dwDataLen]=0;//将数组未尾设零。   
CloseHandle(hFile);//关闭句柄   
MessageBox(FileContent);//输出结果  
 

4.MFC CFile类文件操作。需要包含的头文件afx.h

写入文件:   
CFile file("CFile.txt",CFile::modeCreate| CFile::modeWrite);//构造CFile对象   
file.Write("Welcome to VCFans !",strlen("Welcome to VCFans !"));//写入数据到文件   
file.Close();//关闭CFile对象。   
读取文件:   
CFile file("CFile.txt",CFile::modeRead);//构造CFile对象   
char FileContent[100];   
memset(FileContent,0,100);//初始化FileContent   
file.Read(FileContent,100);//读入数据   
file.Close();//关闭文件对象   
MessageBox(FileContent);//输出数据   

5.MFC CFileDialog类的文件操作。需要包含的头文件Afxdlgs.h

写入文件:   
CFileDialog fileDlg(FALSE,"txt","CFileDialog.txt");//建立CFileDialog对象   
if(IDOK==fileDlg.DoModal())   
{   
    CFile file(fileDlg.GetFileName(),CFile::modeCreate| CFile::modeWrite);//构造CFile对象   
    file.Write("Welcome to VCFans !",strlen("Welcome to VCFans !"));//写入数据到文件   
    file.Close();   
};   
读取文件:   
CFileDialog fileDlg(TRUE,"txt","CFileDialog.txt");//建立CFileDialog对象   
if(IDOK==fileDlg.DoModal())   
{   
    CFile file(fileDlg.GetFileName(),CFile::modeRead);//构造CFile对象   
    char FileContent[100];   
    memset(FileContent,0,100);//初始化FileContent   
    file.Read(FileContent,100);//读入数据   
    file.Close();//关闭文件对象   
    MessageBox(FileContent);   
};   
 
     

6.注册表文件操作。 

写入注册表:   
HKEY hKey;   
DWORD dwSex=1;   
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\vcfans\\reg",&hKey);//打开注册表键   
RegSetValueEx(hKey,"sex",0,REG_DWORD,(CONST BYTE*)&dwSex,4);//写入注册表数据   
RegCloseKey(hKey);//关闭注册表键   
读注册表:   
HKEY hKey;   
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\vcfans\\reg",&hKey);//打开注册表键   
DWORD dwType;   
DWORD dwValue;   
DWORD dwSex;   
RegQueryValueEx(hKey,"sex",0,&dwType,(LPBYTE)&dwSex,&dwValue);//查询注册表数据   
RegCloseKey(hKey);//关闭注册表键   
CString str;   
str.Format("sex=%d",dwSex);   
MessageBox(str);   

上面介绍了Windows编程中各种操作文件的方法,如果是多线程操作文件的话,就必须做对文件操作的安全保障,防止对文件资源的恶性竞争。下面这个列子做了一个简单的文件读写保护。

#include "iostream"
#include "string.h"
#include 
usingnamespace std;

class FileLog
{
    private:
        CRITICAL_SECTION cs;
        HANDLE fileHandle;
        void Lock()
        {
            EnterCriticalSection(&cs);// 进入临界区
        }

        void UnLock()
        {
            LeaveCriticalSection(&cs);//离开临界区
        }

    public:
        FileLog()
        {
            InitializeCriticalSection(&cs);//初始化临界区
            fileHandle=INVALID_HANDLE_VALUE;//先初始化为错误的句柄
        }

        ~FileLog()
        {
            if(fileHandle!=INVALID_HANDLE_VALUE)
            {
                //CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄
                CloseHandle(fileHandle);
            }
            DeleteCriticalSection(&cs);//删除临界区
        }
 
        BOOL Open(constchar*fileName);//打开文件
        FileLog& Write(constchar*content);//向文件中写入内容
        FileLog& WriteLine(constchar*content);//向文件中写入内容
        BOOL Read(char*buf,int size);//读文件内容
        BOOL Close();//关闭文件
};#include "stdafx.h"
#include "FileLog.h"
//打开文件
BOOL FileLog::Open(constchar*fileName)
{
    if(fileHandle==INVALID_HANDLE_VALUE)
    {
        fileHandle=CreateFile(fileName,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
            OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if(fileHandle!=INVALID_HANDLE_VALUE)
        {
            SetFilePointer(fileHandle,0,NULL,FILE_END); 
            return TRUE;
        }
    }
    return FALSE;
}

//写文件 返回当前对象的引用,实现连接操作
FileLog& FileLog::Write(constchar*content)
{
    Lock();
    if(fileHandle!=INVALID_HANDLE_VALUE)
    {
        DWORD dwSize=0;
        WriteFile(fileHandle,content,strlen(content),&dwSize,NULL);//写
    }
    //开始的时候少写了这句,由于加的锁没有释放,一个线程占用之后,导致其他线程只能一直等待,好久都没有找到原因。
    UnLock();   
    return*this;
} 

//写入一行
FileLog& FileLog::WriteLine(constchar*content)
{
    Lock();
    if(fileHandle!=INVALID_HANDLE_VALUE)
    {
        DWORD dwSize=0;
        WriteFile(fileHandle,content,strlen(content),&dwSize,NULL);//写
    }
    UnLock();
    return FileLog::Write("\r\n");
} 

//读文件内容
BOOL FileLog::Read(char*buf,int size)
{
    BOOL isOK=FALSE;
    Lock();
    if(fileHandle!=INVALID_HANDLE_VALUE)
    {
        DWORD dwSize=0;
        isOK=ReadFile(fileHandle,buf,size,&dwSize,NULL);//读
    }
    return isOK;
}

//关闭文件
BOOL FileLog::Close() 
{
    BOOL isOK=FALSE;
    Lock();
    if(fileHandle!=INVALID_HANDLE_VALUE)
    {
        isOK=CloseHandle(fileHandle);
        fileHandle=INVALID_HANDLE_VALUE;
    }
    UnLock();
    return isOK;
}

当让也可以参考我根据转载写的一篇读写者问题的文章,秒杀多线程第十篇 读者写者问题 里面介绍了一个自己写读写锁的类,和一个利用SWLock的例子。了解了这些的话,个人认为能解决在项目中对文件操作的基本问题。

你可能感兴趣的:(文件操作)