俺前段时间写了段功能相似的程序,但用的是用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语言 如何通过文件指针获得文件名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)