您的位置:首页 > 其它

file and directory

2017-06-11 08:45 288 查看
VC目录、文件相关操作
1.遍历文件目录
即把一个目录里的文件以及子目录里的文件名都取出来。本文是CFileFind类的使用例的笔记。下面的程序是从一个目录出发,
把这个目录里的所有成员按着层次TRACE到DEBUG输出画面。
void TravelFolder(CString strDir, int nDepth)
{
CFileFind filefind;                            //声明CFileFind类型变量
CString strWildpath = strDir + _T("\\*.*");     //所有文件都列出。
if(filefind.FindFile(strWildpath, 0))          //开始检索文件
{
BOOL bRet = TRUE;
while(bRet)
{
bRet = filefind.FindNextFile();             //枚举一个文件
if(filefind.IsDots())                        //如果是. 或.. 做下一个
continue;
for (int i = 0; i < nDepth; i ++)                 //层次空格打印
{
TRACE(_T("    "));
}
if(!filefind.IsDirectory())          //不是子目录,把文件名打印出来
{
CString strTextOut = strDir + CString(_T("\\")) + filefind.GetFileName();
TRACE(_T("file = %s\r\n"), strTextOut);
}
else                       //如果是子目录,递归调用该函数
{
CString strTextOut = strDir + CString(_T("\\")) + filefind.GetFileName();
TRACE(_T("dir = %s\r\n"), strTextOut);
TravelFolder(strTextOut, nDepth + 1);//递归调用该函数打印子目录里的文件
}
}
filefind.Close();
}
}
//测试,把d盘的\temp里的所有文件和子目录打印到DEBUG输出画面。
void Test()
{
TravelFolde
4000
r(CString(_T("d:\\temp")), 0);
}
2.目录是否存在并创建文件夹
CString strFolderPath = "c:\\test";
//   判断路径是否存在
if   (! PathIsDirectory(m_strFolderPath))
{
CString strMsg;
strMsg.Format("指定路径\"%s\"不存在,是否创建?", m_strFolderPath);
if   (AfxMessageBox(strMsg, MB_YESNO) == IDYES)
{
if   (! CreateDirectory(m_strFolderPath, NULL))
{
strMsg.Format("创建路径\"%s\"失败!是否继续?", m_strFolderPath);
if (AfxMessageBox(strMsg, MB_YESNO) == IDYES)
return;
}
}
}
创建多层目录
// 判断目录是否存在
bool FolderExists(CString s)
{
DWORD attr;
attr = GetFileAttributes(s);
return (attr != (DWORD)(-1) ) &&   ( attr & FILE_ATTRIBUTE_DIRECTORY);
}
// 递归创建目录,如果目录已经存在或者创建成功返回TRUE
static bool SuperMkDir(CString P)
{
int len=P.GetLength();
if ( len <2 ) return false;
if('\\'==P[len-1])
{
P=P.Left(len-1);
len=P.GetLength();
}
if ( len <=0 ) return false;
if (len <=3)
{
if (FolderExists(P))return true;
else return false;
}
if (FolderExists(P))return true;
CString Parent;
Parent=P.Left(P.ReverseFind('\\') );
if(Parent.GetLength()<=0)return false;
bool Ret=SuperMkDir(Parent);
if(Ret)
{
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=0;
Ret=(CreateDirectory(P,&sa)==TRUE);
return Ret;
}
else
return false;
}
3.打开目录下单个文件
//只能打开单个文件
CFileDialog dlg(TRUE, _T("*.bmp"),"",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
"image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files (*.*)|*.*||",NULL);
char title[]= {"打开图片"};
dlg.m_ofn.lpstrTitle= title;

if ( dlg.DoModal() == IDOK) {
mulPath[0] = dlg.GetFileName();
}else
return;
打开目录下多个文件
CFileDialog dlg(TRUE, _T("*.bmp"),"",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY |OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLEHOOK,
"image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files (*.*)|*.*||",NULL);
char title[]= {"打开图片"};
dlg.m_ofn.lpstrTitle= title;

if ( dlg.DoModal() == IDOK) {
CString tempName;
char* tempPath;
POSITION   pos   =   dlg.GetStartPosition();
//一个个读取文件名然后保存
while (pos != NULL && nCount<=20)
{
tempName = dlg.GetNextPathName(pos);
tempPath = tempName.GetBuffer(tempName.GetLength());
mulPath[nCount++] = strrchr(tempPath,'\\')+1;
//  AfxMessageBox(imageMulPath[nCount-1]);
}
}else
return;
4.获取当前工作路径
CString strAppName;//当前工作目录
::GetModuleFileName(NULL, strAppName.GetBuffer(_MAX_PATH), _MAX_PATH);
strAppName.ReleaseBuffer();
int nPos = strAppName.ReverseFind('\\');
strAppName = strAppName.Left(nPos + 1);

5.文件过滤器
// 文件扩展名过滤器
LPCTSTR szFilter = "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";

//初始目录是c:\windows, 初始选择的文件名是test,初始后缀过滤器是Chart Files (*.xlc)
//CFileDialog dlg(TRUE,NULL ,"C:\\windows\\test" ,OFN_ENABLESIZING ,szFilter,NULL); // 打开用TRUE, 保存用FALSE

//第一个参数变成FALSE,就是保存文件,初始目录是当前工作目录, 初始选择的文件名是file,初始后缀过滤器是Chart Files (*.xlc)
CFileDialog dlg(FALSE,NULL ,strAppName+"file",OFN_ENABLESIZING ,szFilter,NULL); // 打开用TRUE, 保存用FALSE

if(dlg.DoModal() == IDOK)
{
CString strFile = dlg.GetPathName(); // 全路径
MessageBox(strFile,"Title",MB_OK);
}

6.删除非空文件夹
//删除文件夹目录(非空)
bool DeleteDirectory(char* sDirName)
{
CFileFind tempFind;
char sTempFileFind[200] ;

sprintf(sTempFileFind,"%s\\*.*",sDirName);
BOOL IsFinded = tempFind.FindFile(sTempFileFind);
while (IsFinded)
{
IsFinded = tempFind.FindNextFile();

if (!tempFind.IsDots())
{
char sFoundFileName[200];
strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(200));

if (tempFind.IsDirectory())
{
char sTempDir[200];
sprintf(sTempDir,"%s\\%s",sDirName,sFoundFileName);
DeleteDirectory(sTempDir);
}
else
{
char sTempFileName[200];
sprintf(sTempFileName,"%s\\%s",sDirName,sFoundFileName);
DeleteFile(sTempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(sDirName))
{
return FALSE;
}
return TRUE;
}
-------------------------------------------------------------
方法二(直接调用命令):
#include< stdlib.h >
#include< stdio.h >
int main( )
{
system( "md d:\\aa\\zhao " ); // 在下新建文件夹
system( "del d:\\aa\\zhao " ); // 删除该文件夹下的所有文件
}

7.获得当前程序的运行目录(.exe)所在的目录
//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
}

调用示例:
TCHAR *path = new TCHAR[MAX_PATH];
ZeroMemory(path, MAX_PATH);
// path == "d:\Project\Test\MFC\MFC\debug"
GetCurrentDirectory(MAX_PATH, path);
// path ==  "d:\Project\Test\MFC\debug\MFC.exe"
GetModuleFileName(NULL,path,MAX_PATH);

8.判断文件/目录是否存在
BOOL CPubFunc::FileExist(CString FileName)
{
CFileFind fFind;
return fFind.FindFile(FileName);
}

BOOL CPubFunc::DirectoryExist(CString Path)
{
WIN32_FIND_DATA fd;
BOOL ret = FALSE;
HANDLE hFind = FindFirstFile(Path, &fd);
if ((hFind != INVALID_HANDLE_VALUE) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
//目录存在
ret = TRUE;

}
FindClose(hFind);
return ret;
}

9.C或c++文件读写
1.C中
FILE *pFile=fopen("1.txt","w");
fwrite("http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile");
//fseek(pFile,0,SEEK_SET);
//fwrite("ftp:",1,strlen("ftp:"),pFile);
//fwrite("http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile");
fclose(pFile);*/
//fflush(pFile);

表头文件 #include<stdio.h>

FILE * fopen(const char * path,const char * mode);
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:

int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
SEEK_SET: 文件开头
其中SEEK_CUR,SEEK_END和SEEK_SET依次为,和
:fwrite(buffer,size,count,fp);
()buffer:是一个指针,对fwrite来说,是要输出数据的地址。
 ()size:要写入的字节数;
()count:要进行写入size字节的数据项的个数;
()fp:目标文件指针。

int fread(void *ptr, int size, int nitems, FILE *stream);
参 数:用于接收数据的地址(指针)(ptr)
单个元素的大小(size)
元素个数(nitems)
提供数据的文件指针(stream)

:int fflush(FILE *stream)
功 能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件

2.C++中
/* ofstream ofs("4.txt");
ofs.write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
ofs.close();*/
要包括头文件 "fstream.h"

10.CFile操作详解
  各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的
时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中
经常遇到的一些疑难问题进行详细的分析。
  1.文件的查找
  当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可
 以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。
  CString strFileTitle;
  CFileFind finder;
  BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab");
  while(bWorking)
  {
  bWorking=finder.FindNextFile();
  strFileTitle=finder.GetFileTitle();
  }
  2.文件的打开/保存对话框
  让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog
声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。
  在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。此时要重点注
意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过
小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。
  CFileDialog mFileDlg(TRUE,NULL,NULL,
  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
  "All Files (*.*)|*.*||",AfxGetMainWnd());
  CString str(" ",10000);
  mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);
  str.ReleaseBuffer();
  POSITION mPos=mFileDlg.GetStartPosition();
  CString pathName(" ",128);
  CFileStatus
df9f
status;
  while(mPos!=NULL)
  {
  pathName=mFileDlg.GetNextPathName(mPos);
  CFile::GetStatus( pathName, status );
  }
  3.文件的读写
  文件的读写非常重要,下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法:   
  //对文件进行读操作
  char sRead[2];
  CFile mFile(_T("user.txt"),CFile::modeRead);
  if(mFile.GetLength()<2)
  return;
  mFile.Read(sRead,2);
  mFile.Close();
  //对文件进行写操作
  CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
  mFile.Write(sRead,2);
  mFile.Flush();
  mFile.Close();
  虽然这种方法最为基本,但是它的使用繁琐,而且功能非常简单。我向你推荐的是使用CArchive,它的使用方法简单且功能十分强大。
首先还是用CFile声明一个对象,然后用这个对象的指针做参数声明一个CArchive对象,你就可以非常方便地存储各种复杂的数据类型了。
它的使用方法见下例。
  //对文件进行写操作
  CString strTemp;
  CFile mFile;
  mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
  CArchive ar(&mFile,CArchive::store);
  ar<<strTemp;
  ar.Close();
  mFile.Close();
  //对文件进行读操作
  CFile mFile;
  if(mFile.Open("d:\\dd\\try.TRY",CFile::modeRead)==0)
  return;
  CArchive ar(&mFile,CArchive::load);
  ar>>strTemp;
  ar.Close();
  mFile.Close();
  CArchive的 << 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和
WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如:
  //存储CAboutDlg类
  ar.WriteClass(RUNTIME_CLASS(CAboutDlg));
  //读取CAboutDlg类
  CRuntimeClass* mRunClass=ar.ReadClass();
  //使用CAboutDlg类
  CObject* pObject=mRunClass->CreateObject();
  ((CDialog* )pObject)->DoModal();
  虽然VC提供的文档/视结构中的文档也可进行这些操作,但是不容易理解、使用和管理,因此虽然很多VC入门的书上花费大量篇幅讲述文
档/视结构,但我建议你最好不要使用它的文档。关于如何进行文档/视的分离有很多书介绍,包括非常著名的《Visual C++ 技术内幕》。
  如果你要进行的文件操作只是简单的读写整行的字符串,我建议你使用CStdioFile,用它来进行此类操作非常方便,如下例。
  CStdioFile mFile;
  CFileException mExcept;
  mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept);
  CString string="I am a string.";
  mFile.WriteString(string);
  mFile.Close();
  4.临时文件的使用
  正规软件经常用到临时文件,你经常可以会看到C:\Windows\Temp目录下有大量的扩展名为tmp的文件,这些就是程序运行是建立的临时
文件。临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的
路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名。得到此临时文件名以后,你就可以用它来建立并操作文件了,如:
  char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
  GetTempPath(_MAX_PATH, szTempPath);
  GetTempFileName(szTempPath,_T ("my_"),0,szTempfile);
  CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite);
  char m_char='a';
  m_tempFile.Write(&m_char,2);
  m_tempFile.Close();
  5.文件的复制、删除等
  MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、
DeleteFile()、MoveFile()。它们的用法很简单,可参考MSDN。

  1,判断文件是否存在
  access(filename,mode);
  2,对于不同用途又不同的文件操作,其中API函数CreateFile()也是比较有用处理方式,对于巨型文件很合适的其他的楼上的大都说了,不重复了.
  [1]显示对话框,取得文件名
  CString FilePathName;
  CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为S***E AS对话框
  if (dlg.DoModal() == IDOK)
  FilePathName=dlg.GetPathName();
  相关信息:CFileDialog 用于取文件名的几个成员函数:
  假如选择的文件是C:\WINDOWS\TEST.EXE
  则(1)GetPathName();取文件名全称,包括完整路径。取回C:\WINDOWS\TEST.EXE
  (2)GetFileTitle();取文件全名:TEST.EXE
  (3)GetFileName();取回TEST
  (4)GetFileExt();取扩展名EXE
  [2]打开文件
  CFile file("C:\HELLO.TXT",CFile::modeRead);//只读方式打开
  //CFile::modeRead可改为 CFile::modeWrite(只写),
  //CFile::modeReadWrite(读写),CFile::modeCreate(新建)
  例子:
  {
  CFile file;
  file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);
  }
  [3]移动文件指针
  file.Seek(100,CFile::begin);///从文件头开始往下移动100字节
  file.Seek(-50,CFile::end);///从文件末尾往上移动50字节
  file.Seek(-30,CFile::current);///从当前位置往上移动30字节
  file.SeekToBegin();///移到文件头
  file.SeekToEnd();///移到文件尾
  [4]读写文件
  读文件:
  char buffer[1000];
  file.Read(buffer,1000);
  写文件:
  CString string("自强不息");
  file.Write(string,8);
  [5]关闭文件
  file.Close();

  HANDLE CreateFile(
  LPCTSTR lpFileName, //指向文件名的指针
  DWORD dwDesiredAccess, //访问模式(写/读)
  DWORD dwShareMode, //共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
  DWORD dwCreationDisposition, //如何创建
  DWORD dwFlagsAndAttributes, //文件属性
  HANDLE hTemplateFile //用于复制文件句柄
  );
  参数列表
  lpFileName String 要打开的文件的名字
  dwDesiredAccess Long 如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访
问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
  dwShareMode Long, 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
  lpSecurityAttributes SECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)  
  dwCreationDisposition Long,下述常数之一:
  CREATE_NEW 创建文件;如文件存在则会出错
  CREATE_ALWAYS 创建文件,会改写前一个文件
  OPEN_EXISTING 文件必须已经存在。由设备提出要求
  OPEN_ALWAYS 如文件不存在则创建它
  TRUNCATE_EXISTING 讲现有文件缩短为零长度
  dwFlagsAndAttributes Long, 一个或多个下述常数
  FILE_ATTRIBUTE_ARCHIVE 标记归档属性
  FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
  FILE_ATTRIBUTE_NORMAL 默认属性
  FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
  FILE_ATTRIBUTE_READONLY 文件为只读
  FILE_ATTRIBUTE_SYSTEM 文件为系统文件
  FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
  FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
  FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
  FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
  FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
  FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  file