文件操作总结
c语言判断 文件是否存在
PathFileExists()为TRUE 存在,否则不存在
获取运行程序路径 char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); //获取到完整路径如:E:/Tools/qq.exe PathRemoveFileSpec( path );//获取到的是程序所在文件夹如:E:/Tools CString strPathname ; strPathname.Format("%s\\",path); return strPathname
//获取运行程序路径
char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); //获取到完整路径如:E:/Tools/qq.exe
PathRemoveFileSpec( path );//获取到的是程序所在文件夹如:E:/Tools
CString strPathname ; strPathname.Format("%s\\",path);//得到的是E:\Tools\
return strPathname
获取已知文件的路径位置; CString strpath; //绝对路径是已知的; int i = strpath.ReverseFind( '\\'); CString strpathname = strpath.Left( i + 1); 已知文件的路径,获取文件名; CString strpath;//绝对路径是已知的 int i = strpath.ReverseFind( '\\'); CString strpathname = strpath.Mid( i + 1 , strpath.Getlength());
读取和保存CString 类型的文件
1.保存文件 CFileDialog filedlg( FALSE ); filedlg.m_ofn.lpstrFilter="cfg(*.cfg)\0*.cfg";
fileDlg.m_ofn.lpstrFilter = "All Support Files\0*.bmp;*.jpg;*.gif;*.png;\0BMP Files(.bmp)\0*.bmp\0JPEG Files(.jpeg)\0*.jpg\0GIF Files(.gif)\0*.gif\0PNG Files(.png)\0*.png\0\0";
filedlg.m_ofn.lpstrDefExt = "cfg"; CString StrInfo; if(IDOK==filedlg.DoModal()) { GetDlgItemText( IDC_EDIT_CONTENTS ,StrInfo ); save( filedlg.GetFileName() , StrInfo ) ;//把文件名和要保存的内容传给函数save操作; }
BOOL CScreenDefineView::save( CString strFileName , CString &StrInfo ) { BOOL bret = FALSE ; CStdioFile mFile; if (mFile.Open( strFileName , CFile::modeWrite |CFile::modeCreate |CFile::modeNoTruncate ) )//主要打开文件, { mFile.WriteString( StrInfo );写入文件; mFile.Close() ; bret = TRUE; }
return bret; }
2.加载文件 CFileDialog filedlg( TRUE ); filedlg.m_ofn.lpstrFilter="cfg(*.cfg)\0*.cfg"; filedlg.m_ofn.lpstrDefExt = "cfg";
if(IDOK==filedlg.DoModal()) { CString strinfo; if( Load( filedlg.GetPathName(), strinfo ) ) }
BOOL CScreenDefineView::Load( CString pFilename ,CString &strinfo ) {
BOOL bret = FALSE; int nLenDate = 0; CStdioFile file; if(file.Open( pFilename , CFile::modeRead |CFile::typeBinary ))//打开*.TXT这个文件,打开形式为读取 { if( file.GetLength() > 0) { CString strtemp; while ( file.ReadString( strtemp ) ) { strinfo += strtemp + "\r\n"; } bret = TRUE; } file.Close(); }
return bret; }
初始化设置文件 .ini的读取加载操作 .ini文件里面内容格式为 [Setion]//段名,可以用多个段名 nvalue=12//nvalue为变量名,12为变量值 szname=小明//szname为变量名,小明为变量值; 1.读取: 加入文件里面的存的是CString 等字符串类型的话: UINT nLen; char szBuf[1024]; memset(szBuf, 0x00, sizeof(szBuf)); nLen = GetPrivateProfileString(lpszSection, lpszEntry, lpszDefault, szBuf, sizeof(szBuf)/sizeof(TCHAR), m_szFileName); // GetPrivateProfileString("Section", "Key", NULL, sdata, sizeof(sdata),"\MyIniFile.ini");第三个参数是如果读取失败,就给sdata赋值lpszDefault, return szBuf;
假如文件里面存的是数字类型的话:如int,flaot 、二进制等型 int nValue = GetPrivateProfileInt(lpszSection, lpszEntry, nDefault, m_szFileName); //(lpszSection是段名,lpszEntry是变量名,nDefault是如果取得的值失败的话,就返回nDefault给返回值,m_szFileName位文件名;
存储 BOOL bret = WritePrivateProfileString(lpszSection, lpszEntry, lpszValue, m_szFileName); BOOL bret = WritePrivateProfileString(lpszSection, lpszEntry, strText.GetBuffer(), m_szFileName); int nValue = GetPrivateProfileInt(lpszSection, lpszEntry, nDefault, m_szFileName);//如果变量名找不到,就把nDefault赋值给返回值;
CFile file 保存内容和读取内容;CFile保存时要取得保存内容的大小,才能保存; 1CFile file保存 CFile file; if( file.Open( strDataPath, CFile::modeWrite | CFile::modeCreate | CFile::typeBinary ) )//strDataPath为文件名; { int nLen; nLen = m_progData.SaveDataToBuffer( NULL );这里是取得内容大小 if( nLen > 0 ) { byte *pData = new byte[ nLen ]; if( pData ) { bRet = ( m_progData.SaveDataToBuffer( pData ) == nLen );
file.Write( pData, nLen );这里是把大小为nLen的pData保存到文件strDataPath中; delete []pData; pData = NULL; } } file.Close(); }
if( bRet ) { m_strDataPath = strDataPath; } return bRet; }
2.CFile file读取
假如是用char *buf 来读取文件的话,要多出一个字节来截短字符串;buf = new char[nLen +1], 读取后就用 buf[nLen]=0 ,注意,下标是nLen ,不是nLen+1,因为下标是从0开始的;
BOOL CProgData::Load( const CString &strDataPath ) { BOOL bRet = FALSE; CWaitCursor waitCurser; CFile file; if( file.Open( strDataPath, CFile::modeRead | CFile::typeBinary ) ) { if( file.GetLength() > 0 ) { byte *pData = new byte[ file.GetLength() ]; if( pData ) { if( file.GetLength() == file.Read( pData, file.GetLength() ) ) { bRet = m_progData.LoadDataFromBuffer( pData, file.GetLength() ); } delete []pData; pData = NULL; } } file.Close(); }
if( bRet ) { m_strDataPath = strDataPath; } return bRet; }
FILE *fp 读取与保存;FILE 进行读写有个好粗就是可以在原有内容末尾追加内容; FILE *fp; 1.写入; if(fopen(pathname,"a")); char *buf; buf = new buf[1024]; //通过数把要保存的数据赋值给buf,并且保存的数据长度为nLen; fwrite( buf ,nlen,1,fp);//这里表示每次存入长度为nLen,写入1次 fclose(fp)
2.读取 fread(buf,nlen,1,fp); fclose(fp)
r 以只读方式打开文件,该文件必须存在。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) r+ 以可读写方式打开文件,该文件必须存在,并且在写文件时,从文件开头的字符开始依次覆盖文件的内容,如果要写入的字符的长度小于原文件中的长度,则原后面的内容不变(字符
串结尾符‘\0’不写入文件中)。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) (下同) rb+ 读写打开一个二进制文件,允许读数据。 rw+ 读写打开一个文本文件,允许读和写。//这种模式打开会报错,不建议使用 wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 wt+ 读写打开或着建立一个文本文件;允许读写。 at+ 读写打开一个文本文件,允许读或在文本末追加数据。 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制
1.判断文件是否存在
利用CFile类和CFileStatus类判断
CFileStatus filestatus;
if (CFile::GetStatus(_T("d:\\softist.txt"), filestatus))
AfxMessageBox(_T("文件存在"));
else
AfxMessageBox(_T("文件不存在"));
利用CFileFind类判断
CFileFind filefind;
CString strPathname = _T("d:\\softist.txt");
if(filefind.FindFile(strPathname))
AfxMessageBox(_T("文件存在"));
else
AfxMessageBox(_T("文件不存在"));
利用API函数FindFirstFile判断,这个函数还可以判断文件属性,日期,大小等属性。例:
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(_T("d:\\softist.txt"), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("文件不存在"));
}
else
{
AfxMessageBox(_T("文件存在"));
FindClose(hFind);
}
2.文件日期操作。下面是取得"d:\\softist.txt"的文件修改时间,TRACE以后,再把文件修改时间改成 2000-12-03 12:34:56。
HANDLE hFile;
FILETIME filetime;
FILETIME localtime;
SYSTEMTIME systemtime;
hFile = CreateFile(_T("d:\\softist.txt"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
GetFileTime(hFile, NULL, NULL, &filetime); //取得UTC文件时间
FileTimeToLocalFileTime(&filetime, &localtime); //换成本地时间
FileTimeToSystemTime(&localtime, &systemtime); //换成系统时间格式
TRACE("%04d-%02d-%02d %02d:%02d:%02d\r\n",
systemtime.wYear, systemtime.wMonth, systemtime.wDay,
systemtime.wHour, systemtime.wMinute, systemtime.wSecond);
//把文件时间修改成 2000-12-03 12:34:56
systemtime.wYear = 2000; systemtime.wMonth = 12; systemtime.wDay = 3;
systemtime.wHour = 12; systemtime.wMinute = 34; systemtime.wSecond = 56;
SystemTimeToFileTime(&systemtime, &localtime); //换成文件时间格式
LocalFileTimeToFileTime(&localtime, &filetime); //换成UTC时间
SetFileTime(hFile, NULL, NULL, &filetime); //设定UTC文件时间
CloseHandle(hFile);
}
3.设置文件属性
BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes );
dwFileAttributes 的意义
FILE_ATTRIBUTE_ARCHIVE 保存文件
FILE_ATTRIBUTE_HIDDEN 隐藏文件
FILE_ATTRIBUTE_NORMAL 通常文件
FILE_ATTRIBUTE_READONLY 只读文件
FILE_ATTRIBUTE_SYSTEM 系统文件
例:
SetFileAttributes(_T("d:\\softist.txt", FILE_ATTRIBUTE_READONLY);