windows平台c语⾔获取⽂件的⼀些属性(1)
Windows平台有⼀个WIN32_FIND_DATA结构,⽤来存储⽂件的⼀些属性(这⾥指的属性和下⾯结构中⽂件属性成员不同。这⾥的属性是指下⾯结构的所有成员)。
该结构的定义如下。
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //⽂件属性
FILETIME ftCreationTime; // ⽂件创建时间
FILETIME ftLastAccessTime; // ⽂件最后⼀次访问时间
FILETIME ftLastWriteTime; // ⽂件最后⼀次修改时间
DWORD nFileSizeHigh; // ⽂件长度⾼32位
DWORD nFileSizeLow; // ⽂件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长⽂件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式⽂件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
可以使⽤FindFirstFile() 和FindNextFile() 函数可以得到⽂件(包括⽂件夹)的WIN32_FIND_DATA结构信息。
FindFirstFile的原型如下:
FindFirstFile()函数中,第⼀个参数是⼀个字符串。可以是⼀个路径名或者⽂件名,并且⽀持通配符* 和?。⽐如想查D盘下的所有⽂件,可以写成D:\\*.* 或者D:\\*。
如果只想查D盘下的txt⽂件,那么可以写成D:\\*.txt。
第⼆个参数是指向WIN32_FIND_DATA结构体的⼀个指针。正如函数的名字FindFirstFile那样, 该函数会查第⼀个符合查条件的⽂件(使⽤通配符可以有多少⽂
件满⾜查条件)。然后把这个⽂件的⼀些信息写⼊这个结构⾥⾯。如果第⼀个参数没有使⽤通配符,⽽是⼀个⽂件名,那么将只能到⼀个符合条件的⽂件。
函数的返回值是⼀个句柄HANDLE,说⽩了也就是⼀个整型。这个返回值可以⽤来查下⼀个符合查条件的⽂件。这就是下⾯的FindNextFile函数了。如果函数调⽤失败,将返回INV ALID_HANDLE_V ALUE
FindNextFile的原型如下
第⼀个参数就是FindFirstFile函数的返回值。第⼆个参数和FindFirstFile⼀样,在⼀个指针,⽤来存放被查到的⽂件的⼀些信息。
如果查成功,函数返回⾮0值。否则返回0。可以调⽤GetLastError()函数来查看失败原因。如果没有符合要求的⽂件了,那么也将返回0。此时,调⽤GetLastError()函数将返回ERROR_NO_MORE_FILE
S。
在使⽤完上⾯两个函数后,要记得使⽤CloseFile(HANDLE hFindFile)函数来关闭这个句柄。
上⾯三个函数需要包括windows.h头⽂件.
说了这么多,下⾯给出⼀个例⼦代码。
#include
#include
using namespace std;
int main()
{
WIN32_FIND_DATA fileAttr;
HANDLE handle;
handle = FindFirstFile("D:\\*", &fileAttr);
if( handle == INV ALID_HANDLE_V ALUE )
{
cout<<"invalid handle value "<
}
字符串函数怎么获取else
{
cout<
while( FindNextFile(handle, &fileAttr) )
{
cout<
}
if( GetLastError() == ERROR_NO_MORE_FILES )
{
cout<<"查完毕"<
}
else
{
cout<<"查过程出现错误"<
}
FindClose(handle);
}
return 0;
}
现在看⼀下WIN32_FIND_DATA结构的⼀些成员信息。⾸先看⼀下⽂件的⼤⼩信息。该信息⽤了两个成员存储。分别是: DWORD nFileSizeHigh; // ⽂件长度⾼32位
DWORD nFileSizeLow; // ⽂件长度低32位
其中,单位是字节数。
由于nFileSizeHigh存储的是⽂件长度的⾼位,所以当⽂件的⼤⼩⼩于MAXDWORD 时,该成员的值为0。
最后,可以⽤(nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow 来计算⽂件⼤⼩。
⽂件夹的⼤⼩是0 。
现在看⼀下与⽂件有关的时间属性。有三个时间,创建时间、访问时间、修改时间。三者都差不多。只需弄懂⼀个,其他两个就⾃然知道怎么⽤了。
从⽂章最前⾯的WIN32_FIND_DATA结构体可以看到其ftCreationTime 成员是⼀个FILETIME类型。声明如下:
⼀眼看过去,都不知道怎么使⽤。就像C语⾔标准库⾥⾯的time()函数⼀样,返回⼀个从1970年到现在的秒数。这个值很难使⽤。
还好Windows还提供了另外⼀个结构SYSTEMTIME。其声明如下:
这个结构看起来就有点像⼈使⽤的,刚才那个完全是机器使⽤的。
同样,Windows提供了两者相互转换的函数.
两个函数都需要对应结构体的指针。
还有⼀个东西需要注意。
通过FindFirstFile、FindNextFile获取的WIN32_FIND_DATA结构。其FILETIME成员的值都是使⽤UTC时间,就是中学地理学的格林尼治时间。我们中国⽤东8区时间。所以我们还要在这些成员值的基础上加上8 ⼩时。微软不推荐我们直接对FILETIME 结构进⾏加上或者减少某个时间。如果我们要转换成我们当地的时间(就是从UTC时间转换成东8区时间),可以使⽤函数FileTimeToLocalFileTime。其声明如下:
另外,不能就地修改。就是说,第⼀个参数和第⼆个参数要指向不同的内存。
给⼀个例⼦吧。
#include
#include
using namespace std;
ostream& operator << (ostream& os, const SYSTEMTIME& t)
{
os<
os<
return os;
}
int main()
{
WIN32_FIND_DATA fileAttr;
HANDLE handle;
SYSTEMTIME sysTime;
FILETIME localFileTime;
handle = FindFirstFile("D:\\*.txt", &fileAttr);
if( handle == INV ALID_HANDLE_V ALUE )
{
cout<<"invalid handle value "<
}
else
{
cout<
FileTimeToLocalFileTime(&fileAttr.ftCreationTime, &localFileTime); //转换成当地时间FileTimeToSystemTime(&localFileTime, &sysTime); //转换成⼈看的时间类型
cout<
FindClose(handle);
}
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。