高手帮忙啊,如何用API遍历windows所有磁盘,方法?

guchonglin 2011-03-31 10:37:45
关于遍历系统所有文件,需要一个原始的根目录,但windows不同于linux,所以只能一个一个从C:/开始,然后D:/,但是我也不知道C盘之后是D、E ,有可能没有F盘,如何用API获取所有盘列表,包括可能的移动硬文件盘J,K盘等等。遍历系统所有文件还有其他的方法么??
...全文
338 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
TandyT 2011-04-18
  • 打赏
  • 举报
回复
百度或者 google 有现成的,参考下
smwhotjay 2011-04-18
  • 打赏
  • 举报
回复
这些不用再发出来了. 求谷哥,摆渡嘛. 这都成菜园子了. 而我们是卖菜的..
yanganglove 2011-04-18
  • 打赏
  • 举报
回复
一:(要VS2008 SP1)

void CComboBoxSt::InitCombBox()
{

LPITEMIDLIST lpDeskTopId,lpDocumentId;
SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&lpDeskTopId);
m_lpIdList[0]=lpDeskTopId;
SHGetSpecialFolderLocation(NULL,CSIDL_MYDOCUMENTS,&lpDocumentId);
m_lpIdList[1]=lpDocumentId;
SHFILEINFO temp;
SHGetFileInfo((LPCTSTR) lpDeskTopId, 0, &temp, sizeof(temp), SHGFI_PIDL | SHGFI_DISPLAYNAME);


AddString(temp.szDisplayName);
SHGetFileInfo((LPCTSTR) lpDocumentId, 0, &temp, sizeof(temp), SHGFI_PIDL | SHGFI_DISPLAYNAME);

AddString(temp.szDisplayName);

m_nDefaultItemCount=2;

LPSHELLFOLDER lpParent;
HRESULT hr;
hr=SHGetDesktopFolder(&lpParent);

LPENUMIDLIST pEnum = NULL;

lpParent->EnumObjects(NULL, SHCONTF_FOLDERS, &pEnum);

DWORD dwFetched = 1;
LPITEMIDLIST pidlTemp;

while (pEnum->Next(1, &pidlTemp, &dwFetched)==S_OK&&dwFetched)
{

LPENUMIDLIST pEnum2=NULL;
LPSHELLFOLDER lpChild;

lpParent->BindToObject(pidlTemp,NULL,IID_IShellFolder,(LPVOID*)&lpChild);

lpChild->EnumObjects(NULL,SHCONTF_FOLDERS,&pEnum2);

LPITEMIDLIST pidlTemp2;
LPITEMIDLIST lpComputeID;

SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&lpComputeID);

if ((short)HRESULT_CODE(lpParent->CompareIDs(SHCIDS_ALLFIELDS,pidlTemp,lpComputeID))==0)
{


while(pEnum2->Next(0, &pidlTemp2, &dwFetched)==S_OK && dwFetched)
{
LPITEMIDLIST lpDestId;
lpDestId=afxShellManager->ConcatenateItem(pidlTemp,pidlTemp2);//其实只要把这2个PIDL合成不是VS2008 SP1也行

SHFILEINFO sfi2;
SHGetFileInfo((LPCTSTR) lpDestId, 0, &sfi2, sizeof(sfi2), SHGFI_PIDL | SHGFI_DISPLAYNAME);
m_lpIdList[m_nDefaultItemCount]=lpDestId;

AddString(sfi2.szDisplayName);
m_nDefaultItemCount++;
}

}

dwFetched=0;


}
}




二:

void CDataCofferDlg::InitComboBox()
{

//磁盘驱动器
TCHAR *pszDriveStrings=new TCHAR[100];
TCHAR **ppszDriveName;
int nDriveCount=0;

GetLogicalDriveStrings(100*sizeof(TCHAR),pszDriveStrings);

for (int i=0;i<100;i++)
{
if (pszDriveStrings[i]=='\0'&&pszDriveStrings[i+1]!='\0')
{
nDriveCount++;
}
}
ppszDriveName=new TCHAR*[nDriveCount];

for (int i=0;i<nDriveCount;i++)
{
ppszDriveName[i]=new TCHAR[4];
for (int j=0;j<4;j++)
{
ppszDriveName[i][j]=pszDriveStrings[j];
}
pszDriveStrings=pszDriveStrings+4;

}

TCHAR **ppszVolumeNameBuffer=new TCHAR*[nDriveCount];
TCHAR szSysName[10];
DWORD dwSerivalNum,dwMaxFilenameLen,dwSysFlag;

for (int i=0;i<nDriveCount;i++)
{
ppszVolumeNameBuffer[i]=new TCHAR[30];
memset(ppszVolumeNameBuffer[i],0,30*sizeof(TCHAR));

BOOL bSuccess=GetVolumeInformation(
ppszDriveName[i], // root directory
ppszVolumeNameBuffer[i], // volume name buffer
60, // length of name buffer
&dwSerivalNum, // volume serial number
&dwMaxFilenameLen, // maximum file name length
&dwSysFlag, // file system options
szSysName, // file system name buffer
20 // length of file system name buffer
);

if (!bSuccess||ppszVolumeNameBuffer[i][0]=='\0')
{

UINT uType=GetDriveType(ppszDriveName[i]);
if (uType==DRIVE_REMOVABLE)
memcpy_s(ppszVolumeNameBuffer[i],30*sizeof(TCHAR),_T("可移动磁盘"),sizeof(_T("可移动磁盘")));
else if(uType==DRIVE_FIXED)
memcpy_s(ppszVolumeNameBuffer[i],30*sizeof(TCHAR),_T("本地磁盘"),sizeof(_T("本地磁盘")));
else if(uType==DRIVE_REMOTE)
memcpy_s(ppszVolumeNameBuffer[i],30*sizeof(TCHAR),_T("网络驱动器"),sizeof(_T("网络驱动器")));
else if(uType==DRIVE_CDROM)
memcpy_s(ppszVolumeNameBuffer[i],30*sizeof(TCHAR),_T("CD_ROM"),sizeof(_T("CD_ROM")));

}

}
CString *strDriver=new CString[nDriveCount];
for (int i=0;i<nDriveCount;i++)
{
strDriver[i].Format(_T(" %s (%s)"),ppszVolumeNameBuffer[i],ppszDriveName[i]);
m_ctlComboBox.AddString(strDriver[i]);
}


for (int i=0;i<nDriveCount;i++)
{
delete []ppszVolumeNameBuffer[i];
ppszVolumeNameBuffer[i]=NULL;
delete []ppszDriveName[i];
ppszDriveName[i]=NULL;
}
delete []ppszVolumeNameBuffer;
ppszVolumeNameBuffer=NULL;
delete []ppszDriveName;
ppszDriveName=NULL;
delete []strDriver;
}
jackson35296 2011-04-01
  • 打赏
  • 举报
回复
GetLogicalDrives枚举驱动器
GetDriveType获取驱动器类型,可以过滤掉软驱,光驱,移动硬盘等
aiwnx 2011-04-01
  • 打赏
  • 举报
回复
如果想遍历系统所有文件的话,直接使用Everything 工具提供的sdk不就可以了?即快捷又方便,速度令人惊叹。。。
LICHUNLI1022 2011-04-01
  • 打赏
  • 举报
回复
GetLogicalDrives
The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.

DWORD GetLogicalDrives(VOID);
Parameters
This function has no parameters.

Return Values
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Lactoferrin 2011-03-31
  • 打赏
  • 举报
回复
GetLogicalDrives
FindFirstVolume
FindNextVolume
Dreadnought 2011-03-31
  • 打赏
  • 举报
回复
GetLogicalDriveStrings : Fills a buffer with strings that specify valid drives in the system.
用CFileFind遍历文件..网上的例子很多.
.
guchonglin 2011-03-31
  • 打赏
  • 举报
回复
就是结合已有的API进行全盘扫描,遍历,程序如何实现啊?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧