c语言 怎么查找 当前目录有哪些 文件

c语言 怎么查找 当前目录有哪些 文件,第1张

在命令提示符窗口运行:findfile (盘符):\ (文件后缀)

如:[sourcecode language=”plain”]findfile d:\ txt [/sourcecode]

即为找出d盘根目录下的所有txt后缀的文件并写入文件路径于文件中。

俺前段时间写了段功能相似的程序,但用的是用C++/STL写的,访问目录使用了win32 api(能访问指定目录的子目录)。

获取文件名与修改时间由FileOfDirectory::detectFiles实现(其实你只需要看这一个函数即可)。

这段程序以STL数组保存单个文件名,查询过程中没有回溯,wcsstr函数内部也是KMP,所以事实上这个程序也是按KMP查询的

安时间排序时使用STL算法库,时间复杂度同快速排序。

最后,这段代码是在VS2010编译的。

# include <vector>

# include <algorithm>

struct FileNameAndTime

{

wchar_t szPath[MAX_PATH];   //file directory

wchar_t szName[MAX_PATH];  //file name

FILETIME lastAcc;           //last access time

FileNameAndTime()

{

memset(&lastAcc, 0, sizeof(lastAcc));

memset(szName, 0, sizeof(wchar_t)  MAX_PATH);

memset(szPath, 0, sizeof(wchar_t)  MAX_PATH);

}

FileNameAndTime(const PWCHAR fn, const PWCHAR pa, const LPFILETIME ft)

{

if( (0 == fn) || (0 == pa) || (0 == ft) )

return;

memcpy(&lastAcc, ft, sizeof(lastAcc));

wcscpy(szName, fn);

wcscpy(szPath, pa);

}

FileNameAndTime(const FileNameAndTime& fnd)

{

memcpy(&this->lastAcc, &fndlastAcc, sizeof(this->lastAcc));

wcscpy(this->szName, fndszName);

wcscpy(this->szPath, fndszPath);

}

const FileNameAndTime& operator=(const FileNameAndTime& fnd)

{

if(this != &fnd) {

memcpy(&this->lastAcc, &fndlastAcc, sizeof(this->lastAcc));

wcscpy(this->szName, fndszName);

wcscpy(this->szPath, fndszPath);

}

return this;

}

void GetFullPath( wchar_t (&fp)[MAX_PATH] )  const

{

wcscpy(fp, szPath);

wcscat(fp, szName);

}

friend bool operator>(const FileNameAndTime& l, const FileNameAndTime& r);   //compare this object by access time

};

bool operator<(const FileNameAndTime& l, const FileNameAndTime& r)  //for sort

{

if(llastAccdwHighDateTime < rlastAccdwHighDateTime)

return true;

else if (llastAccdwHighDateTime == rlastAccdwHighDateTime)

{

if(llastAccdwLowDateTime < rlastAccdwLowDateTime)

return true;

}

return false;

}

class FileOfDirectory

{

private:

static const wchar_t szDot[];

static const wchar_t szDotDot[];

static const wchar_t cStar;

static const wchar_t cSlash;

private:

std::vector<FileNameAndTime> vecFT;

wchar_t szCurrentPath[MAX_PATH];

private:

void validatePath(const wchar_t pPath)

{

wcscpy(szCurrentPath, pPath);

int len = wcslen(szCurrentPath);

if( (cStar != szCurrentPath[len - 1])

&& (cSlash != szCurrentPath[len - 2]) )

{

szCurrentPath[len] = cSlash;

szCurrentPath[len + 1] = cStar;

szCurrentPath[len + 2] = 0;

return;

}

if( (cStar != szCurrentPath[len - 1])

&& (cSlash == szCurrentPath[len - 2]) )

{

szCurrentPath[len] = cStar;

szCurrentPath[len + 1] = 0;

return;

}

}

void detectFiles(const LPWSTR szDir)

{

WIN32_FIND_DATA ffd;

HANDLE hFind = ::FindFirstFile(szDir, &ffd);

if (INVALID_HANDLE_VALUE == hFind)

return ;

do

{

if (ffddwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

if( (0 == wcscmp(ffdcFileName, szDot)) || (0 == wcscmp(ffdcFileName, szDotDot)))

continue;

else

{

wchar_t szTempPath[MAX_PATH];

wcscpy(szTempPath, szDir);

szTempPath[wcslen(szTempPath) - 1] = 0;

wcscat(szTempPath, ffdcFileName);

int len = wcslen(szTempPath);

szTempPath[len] = cSlash;

szTempPath[len + 1] = cStar;

szTempPath[len + 2] = 0;

detectFiles(szTempPath);

}

}

else  {

wchar_t path[MAX_PATH];

wcscpy(path, szDir);

path[wcslen(path) - 1] = 0;

vecFTpush_back(FileNameAndTime(ffdcFileName,path, &ffdftLastAccessTime));

}

}

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

}

public:

FileOfDirectory(const LPWSTR szDir)

{

validatePath(szDir);

detectFiles(szCurrentPath);

}

void SortByAccessTime()

{

sort(vecFTbegin(), vecFTend());

}

int NumOfFiles() const { return vecFTsize(); }

int FindFilesByKeyWord(wchar_t pszFn, int outCome, int outComeLen, bool bMatchAll = false)

{

wchar_t szTemp[MAX_PATH], szFnLwr[MAX_PATH];

int index = 0;

wcscpy(szFnLwr, pszFn);

_wcslwr(szFnLwr);

for(int i = 0; i < vecFTsize(); ++i)

{

wcscpy(szTemp, vecFT[i]szName);

_wcslwr(szTemp);

if(true == bMatchAll)

{

if(0 == wcscmp(szTemp, szFnLwr))

{

if(index >= outComeLen)

return index;

outCome[index++] = i;

}

}

else

{

if(0 != wcsstr(szTemp, szFnLwr))

{

if(index >= outComeLen)

return index;

outCome[index++] = i;

}

}

}

}

FileNameAndTime GetItemByID(int index)

{

if( (index >= 0) && (index < vecFTsize()) )

return FileNameAndTime(vecFT[index]);

}

};

const wchar_t FileOfDirectory::szDot[] = L"";

const wchar_t FileOfDirectory::szDotDot[] = L"";

const wchar_t FileOfDirectory::cStar = L'';

const wchar_t FileOfDirectory::cSlash = L'\\';

void __stdcall entp3()  //测试程序

{

FileOfDirectory fod(L"E:\\game");

int ids[256] = { 0 };

fodSortByAccessTime();

int len = fodFindFilesByKeyWord(L"main", ids, 256);

for(int i = 0; i <len; ++i) {

FileNameAndTime fnt(fodGetItemByID(ids[i]));

CDbgString::OutputDbgStringW(L"\r\n%s%s", fntszPath, fntszName);

}

}

测试结果如图所示。

//以下是c++方法

#include <stdioh>

#include <ioh>

#include <stringh>

#include <string>

#include <iostream>

using namespace std;

#define WIDTH 300

#define H 40

int len = 0;

string files[1000];

void getFiles(string path, int deepth)

{

    long hFile = 0;

    struct _finddata_t fileinfo;

    string p;

    if((hFile = _findfirst(passign(path)append("\\")c_str(),&fileinfo)) !=  -1)

    {

        do

        { 

            if(fileinfoattrib &  _A_SUBDIR)

            {

                //想取子文件夹里的内容,这里可以用以下代码,deepth控制深度

                //getFiles(path + "/" + fileinfoname, deepth + 1);

            }

            else

            {

                files[len] = fileinfoname;

                ++len;

            }

        }while(_findnext(hFile, &fileinfo)  == 0);

        _findclose(hFile);

    }

}

string path = "E:/";

void main()

{

    int i, res;

    getFiles(path, 0);

    for (i = 0; i < len; ++ i)

        puts(files[i]c_str());

    Sleep(800);

    return;

}

以上就是关于c语言 怎么查找 当前目录有哪些 文件全部的内容,包括:c语言 怎么查找 当前目录有哪些 文件、C语言:如何得到指定地址的文件夹中所有文件的文件名和其修改时间 包括子文件内的、C语言怎么列出指定文件夹或者分区里面的文件和文件夹等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9592972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存