最近在学习文件操作,用到了_findfirst() 和_findnext() 两个函数,写了个小程序,输入一个目录名,输出它下面的文件和目录。
主要用到了这么几个CRT函数:
_access(); /*判断文件或文件夹路径是否合法*/
_chdir(); /*切换当前工作目录*/
_findfirst(); /*查找第一个符合要求的文件或目录*/
_findnext(); /*查找下一个*/
_findclose(); /*关闭查找*/
函数的详细信息请参照msdn。
代码如下:
- #include "io.h"
- #include "direct.h"
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- using std::cerr;
- #include <string>
- using std::string;
- int main()
- {
- string dir;
- cout << "Input the name of directory: ";
- cin >> dir;
- if (_access(dir.c_str(), 06) == -1)
- {
- cerr << "error: directory does not exist." << endl;
- exit(-1);
- }
- if (dir.at(dir.length() - 1) != ‘\\‘)
- {
- dir += ‘\\‘;
- }
- if (_chdir(dir.c_str()) != 0)
- {
- cerr << "error: function _chdir() failed.";
- exit(-1);
- }
- _finddata_t fileinfo;
- memset(&fileinfo, 0x0, sizeof(fileinfo));
- intptr_t iFind = _findfirst("*", &fileinfo);
- if (iFind == -1)
- {
- cerr << "error: function _findfirst failed." << endl;
- exit(-1);
- }
- string filePath(dir + fileinfo.name);
- cout << "name: " << filePath << endl;
- while (_findnext(iFind, &fileinfo) == 0)
- {
- filePath = dir + fileinfo.name;
- cout << "name: " << filePath << endl;
- }
- _findclose(iFind);
- return 0;
- }
这是个简单的小程序,在vs2008下测试可以正常运行。 在这里提醒同样用到这几个函数的朋友,_findnext() 函数在成功时的返回值为0. 一般返回值为0,意思是为假,意味着失败。但CRT中很多函数在成功时返回0,类似的还有strcmp() 等。
我在首次使用时就犯了这个错误,意味_findnext() 成功时返回值 != 0,导致浪费了半天时间来Debug,后来仔细看msdn才纠正过来。