c语言查看文件列表,如何在C ++中获取目录中的文件列表?

如何在C ++中获取目录中的文件列表?

如何获取目录中的文件列表,以便可以处理每个文件?

DShook asked 2020-07-03T16:14:06Z

13个解决方案

58 votes

这是我使用的:

/* Returns a list of files in a directory (except the ones that begin with a dot) */

void GetFilesInDirectory(std::vector &out, const string &directory)

{

#ifdef WINDOWS

HANDLE dir;

WIN32_FIND_DATA file_data;

if ((dir = FindFirstFile((directory + "/*").c_str(), &file_data)) == INVALID_HANDLE_VALUE)

return; /* No files found */

do {

const string file_name = file_data.cFileName;

const string full_file_name = directory + "/" + file_name;

const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;

if (file_name[0] == '.')

continue;

if (is_directory)

continue;

out.push_back(full_file_name);

} while (FindNextFile(dir, &file_data));

FindClose(dir);

#else

DIR *dir;

class dirent *ent;

class stat st;

dir = opendir(directory);

while ((ent = readdir(dir)) != NULL) {

const string file_name = ent->d_name;

const string full_file_name = directory + "/" + file_name;

if (file_name[0] == '.')

continue;

if (stat(full_file_name.c_str(), &st) == -1)

continue;

const bool is_directory = (st.st_mode & S_IFDIR) != 0;

if (is_directory)

continue;

out.push_back(full_file_name);

}

closedir(dir);

#endif

} // GetFilesInDirectory

Thomas Bonini answered 2020-07-03T16:14:36Z

36 votes

但是boost::filesystem可以做到这一点:[http://www.boost.org/doc/libs/1_37_0/libs/filesystem/example/simple_ls.cpp]

Johannes Schaub - litb answered 2020-07-03T16:14:16Z

26 votes

这是Linux上C语言中的示例。 如果您使用的是Linux,并且不介意在ANSI C中做那么一点。

#include

DIR *dpdf;

struct dirent *epdf;

dpdf = opendir("./");

if (dpdf != NULL){

while (epdf = readdir(dpdf)){

printf("Filename: %s",epdf->d_name);

// std::cout << epdf->d_name << std::endl;

}

}

closedir(dpdf);

Chris Kloberdanz answered 2020-07-03T16:14:57Z

4 votes

您必须使用操作系统调用(例如Win32 API)或它们周围的包装器。 我倾向于使用Boost.Filesystem,因为与Win32 API(以及跨平台)相比,它是高级接口。

如果您要使用Win32 API,Microsoft会在msdn上列出功能和示例。

Yacoby answered 2020-07-03T16:15:21Z

4 votes

C ++ 11 / Linux版本:

#include

if (auto dir = opendir("some_dir/")) {

while (auto f = readdir(dir)) {

if (!f->d_name || f->d_name[0] == '.')

continue; // Skip everything that starts with a dot

printf("File: %s\n", f->d_name);

}

closedir(dir);

}

AdrianEddy answered 2020-07-03T16:15:41Z

3 votes

如果您在Windows中并使用MSVC,则MSDN库中有执行此操作的示例代码。

这是该链接中的代码:

#include

#include

#include

#include

void ErrorHandler(LPTSTR lpszFunction);

int _tmain(int argc, TCHAR *argv[])

{

WIN32_FIND_DATA ffd;

LARGE_INTEGER filesize;

TCHAR szDir[MAX_PATH];

size_t length_of_arg;

HANDLE hFind = INVALID_HANDLE_VALUE;

DWORD dwError=0;

// If the directory is not specified as a command-line argument,

// print usage.

if(argc != 2)

{

_tprintf(TEXT("\nUsage: %s \n"), argv[0]);

return (-1);

}

// Check that the input path plus 2 is not longer than MAX_PATH.

StringCchLength(argv[1], MAX_PATH, &length_of_arg);

if (length_of_arg > (MAX_PATH - 2))

{

_tprintf(TEXT("\nDirectory path is too long.\n"));

return (-1);

}

_tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]);

// Prepare string for use with FindFile functions. First, copy the

// string to a buffer, then append '\*' to the directory name.

StringCchCopy(szDir, MAX_PATH, argv[1]);

StringCchCat(szDir, MAX_PATH, TEXT("\\*"));

// Find the first file in the directory.

hFind = FindFirstFile(szDir, &ffd);

if (INVALID_HANDLE_VALUE == hFind)

{

ErrorHandler(TEXT("FindFirstFile"));

return dwError;

}

// List all the files in the directory with some info about them.

do

{

if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

_tprintf(TEXT(" %s

}

else

{

filesize.LowPart = ffd.nFileSizeLow;

filesize.HighPart = ffd.nFileSizeHigh;

_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);

}

}

while (FindNextFile(hFind, &ffd) != 0);

dwError = GetLastError();

if (dwError != ERROR_NO_MORE_FILES)

{

ErrorHandler(TEXT("FindFirstFile"));

}

FindClose(hFind);

return dwError;

}

void ErrorHandler(LPTSTR lpszFunction)

{

// Retrieve the system error message for the last-error code

LPVOID lpMsgBuf;

LPVOID lpDisplayBuf;

DWORD dw = GetLastError();

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER |

FORMAT_MESSAGE_FROM_SYSTEM |

FORMAT_MESSAGE_IGNORE_INSERTS,

NULL,

dw,

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR) &lpMsgBuf,

0, NULL );

// Display the error message and exit the process

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,

(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));

StringCchPrintf((LPTSTR)lpDisplayBuf,

LocalSize(lpDisplayBuf) / sizeof(TCHAR),

TEXT("%s failed with error %d: %s"),

lpszFunction, dw, lpMsgBuf);

MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

LocalFree(lpMsgBuf);

LocalFree(lpDisplayBuf);

}

John Dibling answered 2020-07-03T16:16:05Z

3 votes

我刚刚问了一个类似的问题,这是基于收到的答案的解决方案(使用boost::filesystem库):

#include

#include

#include

using namespace std;

using namespace boost::filesystem;

int main()

{

path p("D:/AnyFolder");

for (auto i = directory_iterator(p); i != directory_iterator(); i++)

{

if (!is_directory(i->path())) //we eliminate directories in a list

{

cout << i->path().filename().string() << endl;

}

else

continue;

}

}

输出如下:

file1.txt

file2.dat

Bad answered 2020-07-03T16:16:30Z

2 votes

解决此问题需要特定于平台的解决方案。 在unix / linux上寻找opendir()或在Windows上寻找FindFirstFile()。 或者,有许多库将为您处理平台特定的部分。

Roland Rabien answered 2020-07-03T16:16:50Z

1 votes

结合了许多代码片段后,我终于找到了适用于Windows的可重用解决方案,该解决方案使用了Visual Studio附带的ATL库。

#include

void getFiles(CString directory) {

HANDLE dir;

WIN32_FIND_DATA file_data;

CString file_name, full_file_name;

if ((dir = FindFirstFile((directory + "/*"), &file_data)) == INVALID_HANDLE_VALUE)

{

// Invalid directory

}

while (FindNextFile(dir, &file_data)) {

file_name = file_data.cFileName;

full_file_name = directory + file_name;

if (strcmp(file_data.cFileName, ".") != 0 && strcmp(file_data.cFileName, "..") != 0)

{

std::string fileName = full_file_name.GetString();

// Do stuff with fileName

}

}

}

要访问该方法,只需调用:

getFiles("i:\\Folder1");

Jean Knapp answered 2020-07-03T16:17:15Z

0 votes

或者您执行此操作,然后读出test.txt:

#include

int main() {

system("dir /b > test.txt");

}

“ / b”表示仅返回文件名,没有更多信息。

Enders answered 2020-07-03T16:17:39Z

0 votes

HANDLE WINAPI FindFirstFile(

__in LPCTSTR lpFileName,

__out LPWIN32_FIND_DATA lpFindFileData

);

将属性设置为仅查找目录。

kenny answered 2020-07-03T16:17:59Z

0 votes

您可以使用以下代码来获取目录中的所有文件。只需对Andreas Bonini答案进行简单修改即可删除“。”的出现。 和“ ..”

CString dirpath="d:\\mydir"

DWORD errVal = ERROR_SUCCESS;

HANDLE dir;

WIN32_FIND_DATA file_data;

CString file_name,full_file_name;

if ((dir = FindFirstFile((dirname+ "/*"), &file_data)) == INVALID_HANDLE_VALUE)

{

errVal=ERROR_INVALID_ACCEL_HANDLE;

return errVal;

}

while (FindNextFile(dir, &file_data)) {

file_name = file_data.cFileName;

full_file_name = dirname+ file_name;

if (strcmp(file_data.cFileName, ".") != 0 && strcmp(file_data.cFileName, "..") != 0)

{

m_List.AddTail(full_file_name);

}

}

tjdoubts answered 2020-07-03T16:18:20Z

-1 votes

void getFilesList(String filePath,String extension, vector & returnFileName)

{

WIN32_FIND_DATA fileInfo;

HANDLE hFind;

String fullPath = filePath + extension;

hFind = FindFirstFile(fullPath.c_str(), &fileInfo);

if (hFind == INVALID_HANDLE_VALUE){return;}

else {

return FileName.push_back(filePath+fileInfo.cFileName);

while (FindNextFile(hFind, &fileInfo) != 0){

return FileName.push_back(filePath+fileInfo.cFileName);}

}

}

String optfileName ="";

String inputFolderPath ="";

String extension = "*.jpg*";

getFilesList(inputFolderPath,extension,filesPaths);

vector::const_iterator it = filesPaths.begin();

while( it != filesPaths.end())

{

frame = imread(*it);//read file names

//doyourwork here ( frame );

sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str());

imwrite(buf,frame);

it++;

}

sam answered 2020-07-03T16:18:36Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值