`
yidongkaifa
  • 浏览: 4051375 次
文章分类
社区版块
存档分类
最新评论

Win32 获取磁盘剩余空间+遍历文件目录+wchar_t与char互转

 
阅读更多
函数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 ,收工。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics