vc遍历文件夹
A. MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题
首先鄙视一下楼主的代码 毫无章法 乱定义变量 居然还不按同一风格定义
其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件
最后我想说的是 他们说的都没找到本质问题上去
把这句话
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
改为 下面2句
CString str = finder.GetFilePath();
pFile = (LPSTR)(LPCTSTR) str;
你的程序就没问题了
下面看偶的分析
第一
char* pFile;
TCHAR* p;
你让 p = pFile ; 居然没出问题 说明 你的char 和 TCHAR 是一样的玩意 你多半用的是VC6开发
要么就是自己设置了工程属性为 多字节的, 所以根本不存在什么 字符集的转换
什么 UNICODE ANSI 多字节都是瞎扯
第二
断点tiao'shi
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
执行后 pFile 指向的是乱码 所以你再往后运行肯定就会出错了
仔细看一下 finder.GetFilePath() 返回的是一个CString;
莫非楼主的 从CString 转换 为 char * 的方式错误了?
测试
CString str("123");
pFile = (LPSTR)(LPCTSTR) str;
完全没有问题啊...
所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦
这如果要说起来就太多了... 楼主再找度娘吧
//-- 下面的写法稍微规范点 我就不懂 你定义 TCHAR 为了什么
int main()
{
CFileFind finder;
CString path("D:\\1\\Cache\\");
CString file;
BOOL has = finder.FindFile(path+"*.*");
while(has)
{
has = finder.FindNextFile();
//IsDots 就是的 . 和 .. 如果你不判断是文件夹 它会把当成文件去删除,结果去删除不掉
//在Windows系统下 文件和文件夹被看作同样的东西
if( !finder.IsDots() && !finder.IsDirectory() )
{
file= finder.GetFilePath();
//CFile::Remove(file); 你这函数都没有返回值 你好意思直接就在下面显示删除成功
if (DeleteFile(file))
{
cout<<file<<" 删除成功"<<endl;
}
else
{
cout<<file<<" 删除失败, 非共享的文件是否正在使用?"<<endl;
}
}
}
finder.Close(); //----
return 0;
}
B. 在windows下 怎么用c语言遍历文件夹要用纯c的
什么叫纯C?
用C语言遍历文件肯定需要用到函数,标准C下貌似没有这个函数,但是使用VC的函数库可能可以实现,如果实在不行可以用第三方函数库,,,还不行的话用system("command");引用dos命令可以遍历,
C. 鎴戞兂鐢╒C镆ユ垒涓涓鏂囦欢澶归噷镄勬墍链涂XT鏂囨。涓链鏂扮殑涓涓 骞惰诲彇瀹幂殑鍐呭 璇烽梾濡备綍镎崭綔锛燂纻锛
缁欎綘涓涓镐濊矾鍏堥亶铡呜繖涓鏂囦欢澶逛笅镄则xt鏂囦欢锛岀劧钖庨愪釜鍒涘缓姣旇缉镞堕棿锛屽苟淇濆瓨链鏂扮殑鏂囦欢钖嶅埌涓涓鍙橀噺涓婇溃锛岀劧钖庣敤CFile锛氾细read璇诲彇鍐呭广
缁欎綘涓娈典吉浠g爜镊宸变慨鏀硅瘯璇
HANDLEhSearch;
WIN32_FIND_DATAFileData,tempFileData;
hSearch=FindFirstFile("E:\XX\*.txt",&FileData);//棣栧厛镓惧埌镄勬槸钬.钬
if(hSearch==INVALID_HANDLE_VALUE)return0;
if(!FindNextFile(hSearch,&FileData))return0;//铹跺悗镓惧埌镄勬槸钬..钬
FindNextFile(hSearch,&tempFileData);//鎶婄涓涓鏂囦欢镄勪俊鎭淇濆瓨鍦╰empFileData涓
while(1)
{
if(!FindNextFile(hSearch,&FileData))
break;
else
{
if锛圕ompareFileTime(FileData.ftCreationTime,tempFileData.ftCreationTime)==-1锛墈
tempFileDataFileData
}
}
}
FindClose(hSearch);
CFilefile;
file.open("璺寰+\tempFileData.cFileName");
charbuf[xx];
file.read(buf......);
file.close();
D. VC6.0编译环境下遍历文件夹的源代码
#include "stdafx.h"
#include <windows.h>
BOOL IsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}
void FindInAll(::LPCTSTR lpszPath)
{TCHAR szFind[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind))
lstrcat(szFind, "\\");
lstrcat(szFind, "*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
FindInAll(szFile); // 如果找到的是目录,则进入此目录进行递归
}
else
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
printf("%s\n",szFile);
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
}
int main(int argc, char* argv[])
{
FindInAll("e:\\result");
return 0;
}
//结合网上资料写出的,作者--杨克群^_^