C语言:如何得到指定地址的文件夹中所有文件的文件名和其修改时间 包括子文件内的

C语言:如何得到指定地址的文件夹中所有文件的文件名和其修改时间 包括子文件内的,第1张

俺前段时间写了段功能相似的程序,但用的是用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);

}

}

测试结果如图所示。

fp=fopen(filename,"wb");里的filename就表示了文件的路径及文件名,所以要把输入的文件名和文件路径拼接起来,计算出这个filename,

例如,

string

filename,

path,

name;

(获取path,

name的值)

filename

=

path

+

name;

fp=fopen(filename,"wb");

在tc20中,一旦你成功打开一个文件,他将返回一个文件指针

FILE fp;

fp=fopen("abcdat",文件状态(如w,r,r+));

当上面的 *** 作成功后文件指针fp就会赋予你打开文件的最基本信息!

FILE结构在Turbo C在stdioh文件中有以下的文件类型声明:

typedef struct

{

short level;                 /缓冲区“满”或“空”的程度/

unsigned flags;              /文件状态标志/

char fd;                    /文件描述符(句柄)/

unsigned char hold;          /如无缓冲区不读取字符/

short bsize;                 /缓冲区的大小/

unsigned char buffer;        /数据缓冲区的位置/

unsigned ar curp;           /指针,当前的指向/

unsigned istemp;            /临时文件,指示器/

short token;                /用于有效性检查/

}FILE;

为管理你打开的文件, *** 作系统为所有的文件创建一个打开文件信息的结构数组---文件控制块(FCB),而文件描述符就承担了访问与之对应的文件控制块的使命,他在c中就充当文件句柄。每一个文件都需要唯一的一个标识,这样才能管理若干个文件

FCB他存贮这你所有打开文件的信息,而只有通过文件句柄才能访问与之对应的FCB,从而访问你的文件

文件句柄,就是FCB结构数组的下标

所以,通过文件指针获得文件名的 *** 作路线:

FILE fp;

char  fd = fp->fd;

FCB fcb;

char filiname = fcb[fd]filiname

利用FCB(文件控制块) *** 作的例子见:

>

system("attrib -s -h"); // 如果需要显示系统文件和隐藏文件

system("DIR /b >> file_listtxt"); // 文件名存入 文件 file_listtxt

/b -- 只取 文件名

较简单的是用DOS命令 DIR 并转向到一个文件,再打开文件读出一个一个文件名。

例如:

char my_cmd[80] = "DIR/B/A-D D:\\USER\\WANG >> abclis";

system( cmd);

你就获得D:\\USER\\WANG 文件夹中的所有文件,选项意思是 只列 文件名,并按字母排列。

>> abclis 转向,存入文件 abclis

接着,你可以 用FILE fp; fp = fopen("abclis","r"); 打开文件

用 fgets() 读文件名。

思路大概如下:将整个字符串及其长度传给函数,然后在函数中用指针接收字符串,利用其长度把指针移到字符串结尾处,然后用循环不断将指针向前移动,并判断其指向的字符与/是不是一样的,如果一样退出循环,此时指针指向着字符串中最后一个/ 的前一个字符, 因此最后将指针再向前移2位到/后面的一个字符,最后反回指针, 再输出返回的指针后面的内容就是名称了

函数声明:char GetName(char,int);

整个程序:

#include<stdioh>

char GetName(char,int);

int main(void)

{

char str[] = ">

以上就是关于C语言:如何得到指定地址的文件夹中所有文件的文件名和其修改时间 包括子文件内的全部的内容,包括:C语言:如何得到指定地址的文件夹中所有文件的文件名和其修改时间 包括子文件内的、C语言中,怎样访问其他路径中的文件、C语言 如何通过文件指针获得文件名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存