为了确定某个逻辑驱动器的类型,必须调用GetDriveType函数。它以路径名作为参数(如C:\),返回DRIVE_FIXED,DRIVE_REMOVABLE,或DRIVE_UNKNOWN。下面列出了所有可能返回的值:这些值在winbase.h定义
#define DRIVE_UNKNOWN 0 // 无效路径名
#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标
#define DRIVE_REMOVABLE 2 // 可移动驱动器(如磁盘驱动器,光驱等)
#define DRIVE_FIXED 3 // 固定的驱动器 (如 通常的硬盘)
#define DRIVE_REMOTE 4 // 网络驱动器
#define DRIVE_CDROM 5 // CD-ROM
#define DRIVE_RAMDISK 6 // 随机存取(RAM) 磁盘
Public Const FILE_" ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_DIRECTORY = &" H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_" NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_" SYSTEM = &H4
Public Const FILE_ATTRIBUTE_" TEMPORARY = &H100
有关驱动器的函数有GetLogicalDrives,GetLogicalDriveStrings和GetDriveType。前两个用来获取逻辑驱动器盘符,GetLogicalDriveStrings返回路径名字符串,如:
"A:\
这里每一个路径名都由NULL(空或者零)字符分隔,最后结尾是两个空字符--这是标准的C风格处理方法。对于喜欢操作位和字节的汇编语言使用者来说,GetLogicalDrives是个很好用的API函数。它以位掩码的形式返回逻辑驱动器。即在一个DWORD类型的返回值中,位0(最小的一位)表示驱动器A,位1表示驱动器B,以此类推。每一个位的状态如果是on,则表示对应的逻辑驱动器存在;否则状态为off,表示对应的逻辑驱动器不存在。大家知道DWORD是一个32位的值,足以包括所有的英文字母,也就是说最多可有26个盘符。
TCHAR buf[100];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
//mfc 中删除dir目录下的东东
void cmd_rd(CString dir)
{
WIN32_FIND_DATA Sr;
HANDLE Handle;
int iattr;
//如果是目录
iattr=GetFileAttributes(dir);
if(iattr==FILE_ATTRIBUTE_DIRECTORY)
{
try
{
Handle=::FindFirstFile(dir+"\\*.*", &Sr);
}
catch(...)
{
return;
}
if (Handle)
{
{
if (Sr.cFileName[0]!='.')
{
if(Sr.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
cmd_rd(dir+"file://%22+sr.cfilename/);
}
else
{
::SetFileAttributes(dir+"file://%22+sr.cfilename,0/);
::DeleteFile(dir+"file://%22+sr.cfilename/);
}
}
} while (::FindNextFile(Handle,&Sr));
::FindClose(Handle);
}
if(iattr==FILE_ATTRIBUTE_DIRECTORY)
::RemoveDirectory(dir);
}
else
{
::SetFileAttributes(dir,0);
::DeleteFile(dir);
}
//mfc 下的控制台清屏
void cmd_cls(HANDLE hConsole)
{
COORD coordScreen = { 0, 0 }; // home for the cursor
//MFC中拷贝文件夹
void cmd_xcopy(char* src,char* dst)
{
HANDLE hFind;
char tmpsrc[256];
strcpy(tmpsrc,src);
strcat(tmpsrc,"\\*.*");
hFind = FindFirstFile(tmpsrc, &FindFileData);
if(hFind == INVALID_HANDLE_VALUE)
return;
CreateDirectory(dst,0);
do
{
char newdst[256];
strcpy(newdst,dst);
if(newdst[strlen(newdst)]!='\\')
strcat(newdst,"\\");
strcat(newdst,FindFileData.cFileName);
char newsrc[256];
strcpy(newsrc,src);
if(newsrc[strlen(newsrc)]!='\\')
strcat(newsrc,"\\");
strcat(newsrc,FindFileData.cFileName);
if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
if(strcmp(FindFileData.cFileName,".")!=0&&strcmp(FindFileData.cFileName,"..")!=0)
{
cmd_xcopy(newsrc,newdst);
}
}else
{
CopyFile(newsrc,newdst,false);
}
}while(FindNextFile(hFind,&FindFileData));
FindClose(hFind);
{
CString pathname = lpPath;
while(pt != -1 && pt<=end)
{
path = pathname.Left(pt+1);
if(_access(path, 0) == -1)
_mkdir(path);
pt = pathname.Find("\\", pt+1);
DWORD dwAttrs;
dwAttrs = GetFileAttributes("c:\\boot.ini");
if (dwAttrs & FILE_ATTRIBUTE_READONLY)
{
//只读
}
其他属性还有:
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_DIRECTORY
可以用"&"位操作来区分;
比如你向知道到底是不是目录,可以这样:
dwAttr=GetFileAttributes(LPCTSTR lpFileName);
if((dwAttr&FILE_ATTRIBUTE_DIRECTORY)==0)//不是目录
;
else//是目录
;