用C/C++如何遍历某文件夹内的所有文件

Rance 2010-03-10 03:35:07
我用的是windows系统,vs2008
我需要从一个文件夹里的每个文件都读出一些信息,然后算出一个东西来
于是需要对该文件夹里的所有文件进行遍历操作
在WINDOWS系统里怎么用C/C++来实现这个?
非常感谢!!!!!!!!
...全文
12838 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcphoenix 2010-11-29
  • 打赏
  • 举报
回复
我操, 这个问题管C/C++鸟事,你要问的是在什么操作系统下怎么遍历文件吧,如果是用脚本语言,那更容易,连操作系统都跨了
buyongxiaohu 2010-11-28
  • 打赏
  • 举报
回复
受用啊,谢谢啊
赵4老师 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 rance 的回复:]
引用 4 楼 zhao4zhong1 的回复:
system("cmd /c dir c:\\windows\\*.* /a-d /b /s >c:\\allfiles.txt");
//然后从文件c:\\allfiles.txt里面逐行读。


你好! 能解释一下这里的各种参数的意思么?
[/Quote]
c:\>dir /?
显示目录中的文件和子目录列表。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。

/A 显示具有指定属性的文件。
attributes D 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 - 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
停用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
sortorder N 按名称(字母顺序) S 按大小 (从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从早到晚)
G 组目录优先 - 颠倒顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/S 显示指定目录和所有子目录中的文件。
/T 控制显示或用来分类的时间字符域。
timefield C 创建时间
A 上次访问时间
W 上次写入的时间
/W 用宽列表格式。
/X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4 用四位数字显示年

可以在 DIRCMD 环境变量中预先设定命令选项。通过添加前缀 - (破折号)
来替代预先设定的命令选项,例如,/-W。


计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
xiangchendub 2010-11-16
  • 打赏
  • 举报
回复
4楼的就行了,简单实用。
zxzxghgh 2010-11-16
  • 打赏
  • 举报
回复
谢谢楼主,我也想问这个问题呢。
suhuaiqiang_janlay 2010-11-16
  • 打赏
  • 举报
回复
Cstring strFolderName = _T("d:\\Folder"); // 文件夹名
CString strFileName= strFolderName +_T("\\*.*"); // 文件名
CFileFind finder;
BOOL bWorking = finder.FindFile(strFileName);
while (bWorking)
{
bWorking = finder.FindNextFile();
strFileName = (LPCTSTR)finder.GetFilePath(); // 取得文件名
}
win74 2010-11-16
  • 打赏
  • 举报
回复
纯C有scandir().
scandir函数:读取特定的目录数据
表头文件:#include <dirent.h>
定义函数:int scandir(const char *dir, struct dirent **namelist, nt (*select) (const struct dirent *), nt

(*compar) (const struct dirent **, const struct dirent**));
函数说明:
scandir()会扫描参数dir指定的目录文件,经由参数select指定的函数来挑选目录结构至参数namelist数组中,最后再调用

参数compar指定的函数来排序namelist 数组中的目录数据。每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的

函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。scandir()会

调用 qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort(). 结构dirent定义请参考

readdir()

返回值 :成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1
错误代码:ENOMEM 核心内存不足
cswuyg 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 shaotine_wu 的回复:]
引用 6 楼 yuzl32 的回复:
http://topic.csdn.net/u/20100305/22/bb6a1939-22d0-464c-858f-29e604d29887.html

里面有语句不是很懂
if (stricmp(FindFileData.cFileName, "..") && stricmp(FindFileData.cFileName, ".……
[/Quote]
..表示上级文件夹,.表示当前文件夹。
aining0809 2010-11-16
  • 打赏
  • 举报
回复
很好很强大,学习中。。。
luciferisnotsatan 2010-11-16
  • 打赏
  • 举报
回复
FindFirstFile
FindNextFile
  • 打赏
  • 举报
回复
遍历拷贝文件夹

HRESULT CopyFileFromPathToPath(LPCWSTR lpwsSrcPath, LPCWSTR lpwsDestPath, BOOL bDeleteSrc/* = FALSE*/)
{
if(NULL == lpwsSrcPath || !PathFileExistsW(lpwsSrcPath))
return E_INVALIDARG;

WCHAR wszDestPath[MAX_PATH] = {0};
lstrcpynW(wszDestPath, lpwsDestPath, MAX_PATH);
if(FAILED(ForceCreateDirectory(wszDestPath)))
return E_FAIL;

WCHAR wszPath[MAX_PATH] = {0};
lstrcpynW(wszPath, lpwsSrcPath, MAX_PATH);
PathAppendW(wszPath, L"\\*.*");

WIN32_FIND_DATAW fd = {0};
HANDLE hFind = FindFirstFileW(wszPath, &fd);
if(INVALID_HANDLE_VALUE == hFind)
return E_NOINTERFACE;

HRESULT hr = E_FAIL;

do
{
if(fd.cFileName[0] == L'.' || fd.cFileName[0] == L'\0')//特殊文件
{
continue;
}

PathAppendW(wszPath, fd.cFileName);
PathAppendW(wszDestPath, fd.cFileName);

if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//目录
{
hr = CopyFileFromPathToPath(wszPath, wszDestPath, bDeleteSrc);
}
else
{

BOOL bRtn = CopyFileW(wszPath, wszDestPath, TRUE);
if(!bRtn)
{
DWORD dwFileAttrib = GetFileAttributesW(wszDestPath);
SetFileAttributesW(wszDestPath, dwFileAttrib & ~FILE_ATTRIBUTE_READONLY);
bRtn = DeleteFileW(wszDestPath);
if(!bRtn)
{
WCHAR wszTemp[MAX_PATH] = {0};
GetTempPathW(MAX_PATH, wszTemp);
PathAppendW(wszTemp, fd.cFileName);
PathAddExtensionW(wszTemp, L".tmp");
MoveFileW(wszDestPath, wszTemp);
}
bRtn = CopyFileW(wszPath, wszDestPath, TRUE);
}
if(!bRtn)
{
hr = E_FAIL;
break;
}
}
hr = S_OK;
} while (FindNextFileW(hFind, &fd));

FindClose(hFind);

if(bDeleteSrc)
ClearPath(lpwsSrcPath);

return hr;
}
jixingzhong 2010-03-10
  • 打赏
  • 举报
回复
遍历文件夹并建成目录树
http://www.vckbase.com/document/viewdoc/?id=620

下载工程,参考一下
archer1214 2010-03-10
  • 打赏
  • 举报
回复
又长见识了
回复内容太短了!
guzhijie1981 2010-03-10
  • 打赏
  • 举报
回复
linux下的我写过;《unix环境高级编程》上有写
「已注销」 2010-03-10
  • 打赏
  • 举报
回复
又长见识了
回复内容太短了!
yuzl32 2010-03-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100305/22/bb6a1939-22d0-464c-858f-29e604d29887.html
jansonleader 2010-03-10
  • 打赏
  • 举报
回复
windows 很麻烦的。。。 改成ubuntu吧! 呵呵
赵4老师 2010-03-10
  • 打赏
  • 举报
回复
system("cmd /c dir c:\\windows\\*.* /a-d /b /s >c:\\allfiles.txt");
//然后从文件c:\\allfiles.txt里面逐行读。
shaotine_wu 2010-03-10
  • 打赏
  • 举报
回复
引用 6 楼 yuzl32 的回复:
http://topic.csdn.net/u/20100305/22/bb6a1939-22d0-464c-858f-29e604d29887.html

里面有语句不是很懂
if (stricmp(FindFileData.cFileName, "..") && stricmp(FindFileData.cFileName, "."))
使用文件名与".."和"."比大小有什么作用?
whypp 2010-03-10
  • 打赏
  • 举报
回复
Option Explicit

Dim fso As New FileSystemObject
Dim fld As Folder

Private Sub Command1_Click()
Dim nDirs As Long, nFiles As Long, lSize As Currency
Dim sDir As String, sSrchString As String
sDir = InputBox("Type the directory that you want to search for", _
"FileSystemObjects example", "C:\")
sSrchString = InputBox("Type the file name that you want to search for", _
"FileSystemObjects example", "vb.ini")
MousePointer = vbHourglass
Label1.Caption = "Searching " & vbCrLf & UCase(sDir) & "..."
lSize = FindFile(sDir, sSrchString, nDirs, nFiles)
MousePointer = vbDefault
MsgBox Str(nFiles) & " files found in" & Str(nDirs) & _
" directories", vbInformation
MsgBox "Total Size = " & lSize & " bytes"
End Sub

Private Function FindFile(ByVal sFol As String, sFile As String, _
nDirs As Long, nFiles As Long) As Currency
Dim tFld As Folder, tFil As File, FileName As String

On Error GoTo Catch
Set fld = fso.GetFolder(sFol)
FileName = Dir(fso.BuildPath(fld.Path, sFile), vbNormal Or _
vbHidden Or vbSystem Or vbReadOnly)
While Len(FileName) <> 0
FindFile = FindFile + FileLen(fso.BuildPath(fld.Path, _
FileName))
nFiles = nFiles + 1
List1.AddItem fso.BuildPath(fld.Path, FileName) ' Load ListBox
FileName = Dir() ' Get next file
DoEvents
Wend
Label1 = "Searching " & vbCrLf & fld.Path & "..."
nDirs = nDirs + 1
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs, nFiles)
Next
End If
Exit Function
Catch: FileName = ""
Resume Next
End Function
加载更多回复(5)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧