如果说计算机系统中有一个具有代表性的概念,那么就是文件了。从虚拟和广义的角度上讲Unix将系统的各种资源都看做文件;同样
目前蒸蒸日上的Linux系统也将系统中的各种资源看做文件,而占有PC机霸主地位的Win平台也将系统资源看做文件。
1、文件的概念
文件: 存储在外存储设备上的一段数据的集合,这段数据用一个文件名标示符标志。例如C语言源代码在各种平台下都存储为一块
ASCII码的数据集合。
在Windows下,系统不但将通常意义下的“文件”看做文件;而且将磁盘设备、通信资源、命名管道、控制台输入和输出等均看做文件。
从虚拟或者广义的角度上来看,系统是由文件构成的。(CPU也可以看成是“文件”的一种)。
win32 API文件操作函数给应用程序提供了一整套的操作各种类型文件的接口,通过这些接口可以方便的访问文件。
2、 创建和打开文件
Win32中使用CreateFile函数来创建和打开所有类型的文件;应用程序可以通过设置不同的模式来从文件中读入、写入
或者读写文件中的内容。还可以指定是否可以共享文件,以读取、写入或者读写文件。
通过CreateFile函数操作文件的时候,会返回一个文件句柄“HFILE”;
CreateFile函数的原型是:
HANDLE CreateFile( LPCTSTR lpFileName, //文件名,通常包含路径
DWORD dwDesiredAccess, //访问文件的存取模式
DWORD dwShareMode, //共享的模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指定文件的安全属性
DWORD dwCreationDisposition, //创建文件的模式
DWORD dwFlagstaffAndAttributes,// 指定新建文件的属性和标志
HANDLE hTemplateFile //指向一个具有GENERIC_READ属性的文件句柄,该文件为要创建的文件
//提供文件属性和文件扩展属性
);
Exp_1:
__________________________________________________
typedef HANDLE HFILE;
HFILE hFile;
hFile=CreateFile(L"createfile.txt",
GENERIC_READ |GENRIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
___________________________________________________
windows为创建或者打开的文件指定一个文件句柄,应用程序如果需要读写文件,需要给读写文件的API函数提供这个文件句柄hFile;
在使用hFile之前通常建议检查其有效性,就像Exp_2;当文件读写完毕建议使用CloseHandle函数关闭打开的文件,这将关闭文件并且
刷新缓冲区。
应用程序可以打开用于控制台输入和输出的文件句柄,当应用程序把“CONIN$”传递给CreateFile时则打开的文件用于控制台输入;而
将“CONOUT$”传递给CreateFile时,则打开的文件用于输出。 这样就会返回标准输入、输出设备的文件句柄;可以通过SetStdHandle函
数重定向标准输入和输出句柄。 可以使用GetStdHandle函数来检索标准输入、输出和错误处理程序。这些函数允许应用程序使用标准文件
句柄和重定向标准输入输出文件。
Exp_2:
if(hFile != INVALID_FILE_VALUE)
{
//这里对文件进行读写操作
......
//操作完后关闭文件
CloseHandle(hFile);
}
_________________________________________________________________
Exp_3: 调用Win32对标准输入和输出进行操作
HFILE hFileStdIn;
char StdInBuf[128];
DWORD dwRead;
dwRead=0;
hFileStdIn=CreateFile("CONIN$",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_READ,
NULL
);
if(hFileStdIn != FILE_INVALID_VALUE)
{
SetFilePointer(hFileStdIn,0,0,FILE_BEGIN);
ReadFile(hFileStdIn,StdInBuf,1,&dwRead,NULL); //从标准输入读取一个字符,相当于getc
StdInBuf[dwRead]='\0';
CloseFile(hFileStdIn);
}
如果查看CRuntime库,那么可以发现getc这样的输入和输出函数,是通过调用系统的API实现输入和输出的。
3、文件指针
当某个文件在应用程序里面被第一次打开时,Windows在文件的起始位置设定一个文件指针。文件指针指示下一次读、写
操作的位置,随着文件的读取和写入,widnows将动态调整这个文件指针,应用程序也可以用SetFilePointer函数来移动文件指
针指向的位置。
应用程序通过调用Win32函数ReadFile和WriteFile来对文件进行读、写操作;这些函数的操作在文件指针指示的位置处进行读
、写给定数量的字节数,但是不对数据进行格式化。
ReadFile见Exp_3;
SetFilePointer见Exp_3;
Exp_4:
------------------------------------------------------------------------------------------------
HFILE hFileStdOut;
char StdOutBuf[128]=“Hello word!”;
unsigend int StrLen;
DWORD dwWrite;
dwWrite=0;
StrLen=strlen(StdOutBuf);
hFileStdOut=CreateFile("CONout$",
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_WRITE,
NULL
);
if(hFileStdIn != FILE_INVALID_VALUE)
{
SetFilePointer(hFileStdOut,0,0,FILE_BEGIN); //实际上如果是第一打开的话,可以不进行定位
WriteFile(hFileStdIn,StdOutBuf,StrLen,&dwWrite,NULL);
CloseFile(hFileStdOut);
}
4、锁定文件和解锁文件
在Windows平台下可能同时又两个应用程序打开一个文件,这时为了防止两个应用程序对同一个文件的同一个区域进行
读写,可以使用LockFile函数进行文件锁定,以防止文件被多应用程序修改。
对文件的访问结束后,可以通过UnlockFile函数对锁定的文件进行解锁。