希德船长 - 2005/6/14 20:02:00
这两天虽然上不来,但是也没闲着。这就是这两天的成果。
[IMG=upload/KFCFile4641_88701cf3179262fe.jpg] [/IMG]
[URL=upload/KFCFile4650_c05df0d5a2c8cc93.zip]软件成品[/URL]
[URL=upload/KFCFile4651_b0a0aa5696233ee8.zip]源代码[/URL]
这次是用MFC写的,不知道有没有什么兼容性问题。
-----------------------------------------------------------
谢谢fish的提醒和代码,已经添加到程序里去了。
月15日6:30
修正了一个隐含BUG,也就是无法识别磁盘空间不足和目标目录被删除的错误情况。
fish - 2005/6/14 20:44:00
不错的一个软件...
解决按ESC或ENTER就会退出的问题:
按Ctrl+W打开下面这个:
[IMG=upload/KFCFile4644_Snap1.gif]上传文件4644[/IMG]
添加一个PreTranslateMessage()函数(双击就可以)
按下面的来写
BOOL CFileManageAndMoveDlg::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYDOWN == pMsg->message)
{
if(VK_RETURN == pMsg->wParam)
return TRUE;
if(VK_ESCAPE == pMsg->wParam)
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
orlye - 2005/6/14 20:53:00
谢谢两位。
程序不错,我正想要这么个程序。
楼上教得不错。mfc默认按回车键就退出。我正想知道怎么把它改掉呢。
kzhou - 2005/6/15 2:39:00
kfc真是藏龙卧虎啊
拜一下
希德船长 - 2005/6/15 6:44:00
6月15日6:30
看来由于我经验不足,又给大家添麻烦了。之前的这个程序有一个隐含BUG。
昨天晚上想到了一个问题,就是执行错误中,只考虑到了文件名重复,没有判断其他错误。这样会出现隐含的问题。比如说,磁盘空间不够,或者因为设定了存储路径后由外部删掉该文件夹(应该没人这么做吧)而导致找不到目标文件夹的错误,都会当成文件名重复处理,使得处理过程终止(但是不会丢失数据,即使选了“替换”)。
这次修正了这个BUG,还有,为了保险,把文件移动改成了“写穿透”方式。
fish - 2005/6/15 14:01:00
嘿嘿,改了一下,在OnButtondo()里面加入了:
/*
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // root path
LPDWORD lpSectorsPerCluster, // sectors per cluster
LPDWORD lpBytesPerSector, // bytes per sector
LPDWORD lpNumberOfFreeClusters, // free clusters
LPDWORD lpTotalNumberOfClusters // total clusters
);
*/
if(MoveToAnotherDriver)
{
GetDlgItemText(IDC_EDITSAVEPATH,SavePath1); //CString SavePath1,Temp2
Temp2 = SavePath1.Left(3);
GetDiskFreeSpace(Temp2,&sePcl,&byPse,&freeCl,&totCl);
FreeSpace = byPse*freeCl*sePcl;
for(i = 0; i < n; i++)
{
m_listD.GetText(i,Temp2);
HANDLE hFile=CreateFile(Temp2,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile != NULL)
{
Total_FileSize += GetFileSize(hFile,NULL);
}
CloseHandle(hFile);
}
if(FreeSpace < Total_FileSize)
{
MessageBox("目标磁盘空间不足","错误",MB_OK|MB_ICONSTOP);
return;
}
}
//下面是原来的代码
//执行移动操作
if(ReName)
index = ns+n-1;
定义的部分:
DWORD Total_FileSize=0,FreeSpace,sePcl,byPse,freeCl,totCl;
这样加了以后,移动之前就会检测一下目标盘是否有足够空间,不够的话就会拒绝移动的了 XD