函数GetDiskFreeSpaceEx声明如下:
WINBASEAPI
BOOL
WINAPI
GetDiskFreeSpaceExA(
__in_opt LPCSTR lpDirectoryName,
__out_opt PULARGE_INTEGER lpFreeBytesAvailableToCaller,
__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
WINBASEAPI
BOOL
WINAPI
GetDiskFreeSpaceExW(
__in_opt LPCWSTR lpDirectoryName,
__out_opt PULARGE_INTEGER lpFreeBytesAvailableToCaller,
__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
#ifdef UNICODE
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW
#else
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA
#endif // !UNICODE
lpDirectoryName是驱动器的名称。
lpFreeBytesAvailableToCaller是用户可用的磁盘空间。
lpTotalNumberOfBytes是磁盘总共的空间。
lpTotalNumberOfFreeBytes是磁盘空闲的空间。以上都是字节为单位。
//跟别的兄台一样,客户说我写的软件会有数据丢失,后来发现是没有做硬盘剩余空间的检测, //不管有N多数据,照单全收,无一漏网。。 //以下代码补上之后,再加一个提示对话框就比较保险了。。 void DiskFree(void) { // ULARGE_INTEGER nFreeBytesAvailable; ULARGE_INTEGER nTotalNumberOfBytes; ULARGE_INTEGER nTotalNumberOfFreeBytes; // if (GetDiskFreeSpaceEx(_T("I:"), &nFreeBytesAvailable, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes)) { TCHAR chBuf[256]; wsprintf(chBuf,_T("Av=%I64d,Total=%I64d,Free=%I64d\r\n"), nFreeBytesAvailable, nTotalNumberOfBytes, nTotalNumberOfFreeBytes); printf("free space == %s \n",chBuf); } }
注明: 我用的数据是:nFreeBytesAvailable.QuadPart.
报错:void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)
解决方案:
将strInfo.Format(" %d ",mGainParam.nHave);改为==>>
strInfo.Format(_T(" %d "),mGainParam.nHave);即可。
报错:error C2664: 'strlen' : cannot convert parameter 1 from 'LPCTSTR' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
解决方案:
将nLength=strlen((LPCTSTR)strInfo); 改为:
nLength=(UINT)strlen((char *)strInfo.GetBuffer(0)); 即可.
将char转化为wchar_t型:
void c2w(wchar_t *pwstr,size_t len,const char *str) { if(str) { size_t nu = strlen(str); size_t n =(size_t)MultiByteToWideChar(CP_ACP,0,(const char *)str,(int)nu,0,0); if(n>=len)n=len-1; MultiByteToWideChar(CP_ACP,0,(const char *)str,(int)nu,pwstr,(int)n); pwstr[n]=0; } }
将wchar_t转化为char型:
//将wchar_t* 转成char*的实现函数如下: char *w2c(char *pcstr,const wchar_t *pwstr, size_t len) { int nlength=wcslen(pwstr); //获取转换后的长度 int nbytes = WideCharToMultiByte( 0, // specify the code page used to perform the conversion 0, // no special flags to handle unmapped characters pwstr, // wide character string to convert nlength, // the number of wide characters in that string NULL, // no output buffer given, we just want to know how long it needs to be 0, NULL, // no replacement character given NULL ); // we don't want to know if a character didn't make it through the translation // make sure the buffer is big enough for this, making it larger if necessary if(nbytes>len) nbytes=len; // 通过以上得到的结果,转换unicode 字符为ascii 字符 WideCharToMultiByte( 0, // specify the code page used to perform the conversion 0, // no special flags to handle unmapped characters pwstr, // wide character string to convert nlength, // the number of wide characters in that string pcstr, // put the output ascii characters at the end of the buffer nbytes, // there is at least this much space there NULL, // no replacement character given NULL ); return pcstr ; }
对于CString类型的字符写入,最好使用WriteString函数,如果像我这块土豆一样,用Write,否则会出现写一个字符,中间空一格。
也就是Unicode字符。
SeekToBegin(); //到达文件开头
SeekToEnd(); //到达文件尾
下面这个代码是遍历某个目录下所有文件,并对特定格式的文件进行处理的一个实例:
void FindAllFile(CString pSourcePathString) { CFileFind finder; CFile tmpFile; ULONGLONG fileLen; CString filepath; CString filename; BYTE *data =NULL; CString tmpDir=pSourcePathString + _T("\\*.ex"); BOOL ret=finder.FindFile(tmpDir); while(ret) { ret=finder.FindNextFile(); if(finder.IsDots()) continue; if (finder.IsDirectory()) { printf("find a directory ! \n"); }else { // 下面就是我们对匹配的文件做处理... filename=finder.GetFileName(); filepath=finder.GetFilePath(); tmpFile.Open(filepath,CFile::modeRead); fileLen=tmpFile.GetLength(); //获取file文件中内容的长度; //CheckDiskFree(pDestPathString,fileLen); // 写入记录信息。 //LogFile.SeekToEnd(); //LogFile.WriteString(filename); data =new BYTE[(size_t)fileLen+1];//定义一个存放数据的指针; memset(data ,0,(size_t)fileLen+1);// 将已开辟内存空间 data的,长度为len+1首 个字节的值设为值 0 tmpFile.Read(data,(UINT)fileLen);//读取文件内容并赋值给data; tmpFile.Close(); delete [] data; } } }
Ok ,收工。。