VC文件操作

在VC中文件操作有三种方式,使用C标准库,使用WINAPI或使用MFC库
一.C标准库
1.创建打开文件fopen
FILE *fopen(const char* filename,
Const char* mode)//相应有Unicode版本 _wfopen
filename文件名
还有基于CRT的安全版本
errno_t fopen_s(
FILE ** pFile,
const char * filename,
const char * mode) //相应有Unicode版本 _wfopen_s
pFile要接收指向已打开的文件的指针的指针
filename文件名
mode:
r 以只读方式打开文件,该文件必须存在;
r+ 以可读写方式打开文件,该文件必须存在;
rb+ 读写打开一个二进制文件,允许读数据;
rw+ 读写打开一个文本文件,允许读和写;
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件;
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件;
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留);
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留);
wb 只写打开或新建一个二进制文件;只允许写数据;
wb+ 读写打开或建立一个二进制文件,允许读和写;
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据;
at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写;
2.读取文件
size_t fread(void * buffer,
size_t size,
size_t count,
FILE * stream)
buffe输出文件的缓存指针
size每次读取的最小单位
count读取次数
stream读取的文件指针
返回实际读取到的文件块数
size_t fread_s(
void * buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE * stream)
buffer读取数据的存取位置
bufferSize读取数据的缓冲区大小
elementSize每次读取块的最小单位
count读取想的数量
stream文件句柄
3.fwrite写操作
size_t fwrite(
const void * buffer,
size_t size,
size_t count,
FILE * stream)

4.fseek跳转
int fseek(
FILE * stream,
Long offset,
int origin)//64位的跳转方法fseeki64
offset偏移位置
origin初始位置 //三个参数SEEK_CUR文件指针的当前位置;SEEK_END文件结尾;SEEK_SET文件开头
成功返回0失败非0值
5.关闭流fclose
Int fclose(FILE * stream)
如果关闭成功返回0
二.WinApi
1.创建或打开一个文件CreateFile
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
lpFileName要打开的文件名称
dwDesiredAccess指明对象的控制模式。一个应用可以包含读控制,写控制,读/写控制,设备查询控制; 
0 指定设备查询控制:程序可以不访问设备就查询到设备属性
GENERIC_READ 指定读控制,可以从对象中读取数据
GENERIC_WRITE 指定写控制,可以向对象中写数据
标准控制权限(16-23位掩码):
DELETE 删除对象的权限。
READ_CONTROL 从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息
WRITE_DAC 修改对象安全描述符中的DACL(随机访问控制列表)的权限
WRITE_OWNER 修改对象安全描述符中的属主的权限
SYNCHRONIZE 同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)
STANDARD_RIGHTS_REQUIRED 等价于前面四种权限的总合(通常这四种是必须具有的权限)
STANDARD_RIGHTS_READ 一般等价于READ_CONTROL
STANDARD_RIGHTS_WRITE 一般等价于READ_CONTROL
STANDARD_RIGHTS_EXECUTE 一般等价于READ_CONTROL
STANDARD_RIGHTS_ALL 等价于前面五种权限的总合
特殊控制权限(0-15位掩码):
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL 
dwShareMode指定对象的共享模式,如果为0,表示是互斥使用的,如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能再打开使用
FILE_SHARE_DELETE 打开操作只有在删除时才能返回成功
FILE_SHARE_READ 打开操作只有在读时才能返回成功
FILE_SHARE_WRITE 打开操作只有在写时才能返回成功
dwCreationDisposition指名当代开对象不存在时需要怎么样的处理,以下其中之一:
CREATE_NEW 创建新文件/对象(当对象已经存在是将返回失败)。
CREATE_ALWAYS 总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。
OPEN_EXISTING 打开文件(如果不存在就返回失败)。
OPEN_ALWAYS 存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
TRUNCATE_EXISTING 存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。
dwFlagsAndAttribute指定文件的属性标志以下任意组合,(有FILE_ATTRIBUTE_NORMAL必须单独使用)
FILE_ATTRIBUTE_ARCHIVE文件存档(备份或移动时会对文件做标记);FILE_ATTRIBUTE_ENCRYPTED 加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加密属性),与此同时,如果还设置了FILE_ATTRIBUTE_SYSTEM属性,当前这个属性将无效;
FILE_ATTRIBUTE_HIDDEN 隐藏属性;
FLE_ATTRIBUTE_NORMAL 文件没有其他属性设置,此属性只能单独使用才合法;
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 不建立内容索引;
FILE_ATTRIBUTE_OFFLINE 脱机属性。文件内容暂时不可用。此属性被Remote Storage软件所用,不能任意更改;
FILE_ATTRIBUTE_READONLY 只读文件属性。应用程序不能写或删除;
FILE_ATTRIBUTE_SYSTEM 文件是系统文件或被操作系统互斥地使用;
FILE_ATTRIBUTE_TEMPORARY 临时文件,使用过程中尽量留在内存以保证存取速度;
FILE_FLAG_WRITE_THROUGH 指示系统立即写磁盘。这个写操作允许被cache缓存,但不能被搁置;
FILE_FLAG_OVERLAPPED 指示系统初始化对象,如果操作需要大量时间执行就先返回一 个 ERROR_IO_PENDING,当操作 完成后再通过事件使能信号量。指定这个标志就必须在read和write函数里初始化OVERLAPPED 结构体,应用程序必须执行重复的读写操作。此时,操作系统不维护文件指针,当前的位置 需要通过OVERLAPPED的指针传递给读写函数。这个标志还允许多个操作的并行(并行读写);
FILE_FLAG_NO_BUFFERING 指示系统不要缓冲,它如果和FILE_FLAG_OVERLAPPED联合使用,将呈现最好的异步性能,因为I/O操作并不依赖于内存管理器的同步性。但是有时I/O操作会慢些,因为没用cache。有时程序需要做调整,比如文件大小必须是扇区大小的整数倍,Buffer地址的按扇区地址对齐等。按扇区地址对齐内存边界可以使用VirtualAlloc来分配内存,GerDiskFreeSpace函数可以得到磁盘一个扇区的大小;
FILE_FLAG_RANDOM_ACCESS 指示文件进行随即存取,系统可据此对cache的分配进行优化;
FILE_FLAG_SEQUENTIAL_SCAN 指示顺序存取,系统也可据此对cache的分配进行优化。即使有随即存取的操作,也不会出错,不过cache的优化就取消了。在连续读取大文件时性能非常好;
FILE_FLAG_DELETE_ON_CLOSE 指示系统在句柄关闭时将响应的文件立即删除,对当前句柄以外的其他句柄也有效。而且随后的打开请求也会失败,直到你使用了FILE_SHARE_DELETE属性;
FILE_FLAG_BACKUP_SEMANTICS 在Windows NT/2000/XP平台上:指示文件作为备份或恢复文件打开,这是如果调用进程拥有特殊权限(SE_BACKUP_NAME 或 SE_RESTORE_NAME),就可以不进行安全检查。也可以在获得一个目录的句柄时设置这个flag,目录句柄可以代替文件句柄传递给一些函数;
FILE_FLAG_POSIX_SEMANTICS 指明按照操作系统接口规范进行文件存取,这包括允许多文件名的使用。请谨慎使用,因为MS_DOS或16位Windows系统可能不支持;
FILE_FLAG_OPEN_REPARSE_POINT 这个标志指明禁止文件系统的重解析点的动作。文件打开时就返回文件的句柄,而不在乎控制重解析点的过滤器是否可运行。不能和CREATE_ALWAYS同时使用;
FILE_FLAG_OPEN_NO_RECALL 表明文件数据被请求,但仍然驻留在远程存储体中,而不会被传回本地存储体。这个标志 由远程存储系统或分层存储管理系统使用。如果CreateFile函数打开一个命名管道的客户端,dwFlagsAndAttributes 参数也会包含服务信息的安全性。当调用程序指定了;
SECURITY_PRESENT标志时,dwFlagsAndAttributes 参数可以取以下一个或多个值: SECURITY_ANONYMOUS 指定将客户端模拟在匿名级别(the Anonymous impersonation level) 
SECURITY_IDENTIFICATION 指定将客户端模拟在身份认证级别(the Identification impersonation level)
SECURITY_IMPERSONATION 指定将客户端模拟在伪装级别(the Impersonation impersonation level)
SECURITY_DELEGATION 指定将客户端模拟在授权级别(the Delegation impersonation level)
SECURITY_CONTEXT_TRACKING 指定安全跟踪模式是动态的,否则(不指定此标志)是静态的
SECURITY_EFFECTIVE_ONLY 指定客户端的安全内容中的有效内容才可以被服务端使用,否则所有内容都可被使用。 这个标志允许客户端限制服务端在模拟客户端时所具有的权限。
hTemplateFile把具有GENERIC_READ权限的句柄指定为一个模板文件。这个模板文件提供了文件属性和扩展属性,用于创建文件。在Windows95/98/Me平台上:这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为ERROR_NOT_SUPPORTED
调用如果成功,返回值时一个打开文件的句柄。
在Windows 2000/XP平台上:
如果你企图打开一个远程机器上的文件或目录,dwDesiredAccess设置为DELETE或者任一其他的控制标志,而这时远程文件或目录还没有以FILE_SHARE_DELETE的方式打开的话,你的函数调用就会发生共享错误了。为了避免共享错误,一种办法是单独用DELETE方式打开远程文件或目录,另一种方法是在打开文件或目录之前先调用DeleteFile函数。
如果dwCreationDisposition 参数指定为CREATE_ALWAYS 并且dwFlagsAndAttributes 参数指定为FILE_ATTRIBUTE_NORMAL 的话,CreateFile调用将失败,GetLastError报告的错误是ACCESS_DENIED。这时,把dwFlagsAndAttributes 参数设置为FILE_ATTRIBUTE_HIDDEN和FILE_ATTRIBUTE_NORMAL的联合值,将避免这个问题。
2.ReadFile函数从文件指针指定的位置读取数据。读操作完成后,文件指针将根据实际读出的数据自动进行调整,除非文件句柄是以OVERLAPPED属性值打开的。如果是以OVERLAPPED打开的I/O,应用程序就需要自己手动调整文件指针。
这个函数被设计成兼有同步和异步操作。ReadFileEx函数则设计成只支持异步操作,异步操作允许应用程序在读文件期间可以同时进行其他的操作。
BOOL ReadFile(HANDLE hFile, 
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead, 
LPDWORD lpNumberOfBytesRead, 
LPOVERLAPPED lpOverlapped)
hFile文件句柄(必须具有GENERIC_READ访问权限)。在Windows NT/2000/XP平台上:对于异步读操作,hFile可以是由CreateFile函数以FILE_FLAG_OVERLAPPED方式打开的任何句柄,或者一个由socket或accept函数返回的socket句柄。 在Windows 95/98/Me平台上:对于邮槽、命名管道和磁盘文件不能使用异步读操作。
lpBuffer用来接收从文件中读出的数据的缓冲区指针。
nNumberOfBytesToRead 指明要读的字节总数。
lpNumberOfBytesRead 一个变量指针,用来存储实际传输的字节总数。ReadFile在做所有事情(包括错误检查)之前,先将这个值赋为0。当ReadFile从一个命名管道上返回TRUE时这个参数为0,说明消息管道另一端调用WriteFile时设置的nNumberOfBytesToWrite 参数为0;在Windows NT/2000/XP平台上:如果lpOverlapped 为NULL,则lpNumberOfBytesRead不能为NULL。如果lpOverlapped 不是NULL,lpNumberOfBytesRead可以设为NULL。如果是一个overlapped形式的读操作,我们可以动用GetOverlappedResult函数来获得传输的实际字节数。如果hFile关联的是一个完成端口(I/O completion port),那么可以调用GetQueuedCompletionStatus函数来获得传输的实际字节数。如果完成端口(I/O completion port)被占用,而你用的是一个用于释放内存的回调例程,对于lpOverlapped参数指向的OVERLAPPED结构体来说,为这个参数指定NULL可以避免重新分配内存时发生内存泄漏。内存泄漏会导致返回这个参数值时是一个非法值。 Windows 95/98/Me平台上:这个参数不允许为NULL。
lpOverlapped 一个指向OVERLAPPED结构体的指针。如果hFile是以FILE_FLAG_OVERLAPPED方式获得的句柄,这个结构是必须的,不能为NULL。(否则函数会在错误的时刻报告读操作已经完成了)。这时,读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,并且在实际完成读操作之前就返回了。在这种情况下,ReadFile返回FALSE,GerLastError报告从错误类型是ERROR_IO_PENDING。这允许调用进程继续其他工作直到读操作完成。OVERLAPPED结构中的事件将会在读操作完成时被使能。 如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped为NULL,读操作就从当前文件的开始位置读起,直到读操作完成ReadFile函数才能返回。在Windows NT/2000/XP平台上:如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped不为NULL,则读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,直到读操作完成ReadFile函数才能返回。在Windows 95/98/Me平台上:对于文件、磁盘、管道和邮槽的操作,这个参数必须为NULL。一个不为空的OVERLAPPED结构体指针将导致调用失败。Windows 95/98/Me平台只支持串行口和并行口的overlapped 读写。 
有如下任一种情况发生都会导致函数返回:(1)在管道另一端的写操作完成后(2)请求的字节数传输完毕(3)发生错误。 如果函数正确,返回非零。 如果返回值是非零,但接收的字节数是0,那么可能是文件指针在读操作期间超出了文件的end位置。然而,如果文件以FILE_FLAG_OVERLAPPED方式打开,lpOverlapped 参数不为NULL,文件指针在读操作期间超出了文件的end位置,那么返回值肯定是FALSE,GetLastError返回的错误是ERROR_HANDLE_EOF。
3.WriteFile可以以同步或异步的方式向一个对象句柄中写数据
BOOL WriteFile(HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped)
三MFC
CFile类:通常,在CFile类构造时用于自动打开一个磁盘文件,析构时关闭文件。静态成员函数允许查阅一个未打开的文件。
1.Open打开文件
virtual BOOL Open(LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL)
CFile::modeCreate 直接构造去创建一个新的文件如果这个文件存在,则删除这个文件里所有内容   
CFile::modeNoTruncate 联合创建属性,如果这个文件已创建,则不删除原文件内容,因而这个文件是可以当做一个已经存在,或者不存在而被新建的文件来保证打开。这是非常有意义的,例如,打开来设置一个存在或者不存在的文件都是可以的。这个属性对于CStdioFile也是非常好的
CFile::modeRead 打开为只读属性.
CFile::modeWrite 打开为只写属性.
CFile::modeReadWrite 打开为读写属性.
CFile::modeNoInherit 防止这个文件来源于子进程.
CFile::shareDenyNone 在这个文件读写处理之外打开这个文件
CFile::shareDenyRead 以独占方式打开,拒绝其他读操作
CFile::shareDenyWrite 以独占方式打开,拒绝其他写操作
CFile::shareExclusive 以独占方式打开文件,拒绝其他读写操作访问这个文件Opens the file with exclusive mode, denying other 如果这个文件已打开进行读写操作则构造失败
CFile::shareCompat 这个属性在 32 bit MFC是不可用的. This flag maps to CFile::shareExclusive 当应用在CFile::Open.
CFile::typeText 设置文本模式特别处理回车换行 (used in derived classes only).
CFile::typeBinary 设置二进制模式(used in derived classes only).
2.读文件
virtual UINT Read(
void* lpBuf,
UINT nCount )
lpBuf:用户指定的要存储所读的内容的缓冲区指针
nCount:指定要读写的最大字节数
返回实际读的字节数 当遇到EOF时,小于nCount
3.写文件
virtual void Write(
const void* lpBuf,
UINT nCount)
lPBuf:指向要写入的数据的缓冲区
nCount:要写入的字节数
4.刷新缓存
virtual void Flush( )
将文件缓冲区中的数据写进文件中,一般在调用write函数之后都要调用以下Flush函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值