文件操作总结

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);

复制代码
posted @ 2013-06-29 15:25  友琼  阅读(491)  评论(0编辑  收藏  举报