如何获取C中所有驱动器的列表
是否有任何方法可以让我列出所有可用的驱动器及其文件夹内容。ie我想访问所有驱动器,然后是每个驱动器中的文件夹,然后是每个文件夹的子文件夹,依此类推,直到每个驱动器中的最后一个可能的级别如何获取C中所有驱动器的列表,c,windows,file,C,Windows,File,是否有任何方法可以让我列出所有可用的驱动器及其文件夹内容。ie我想访问所有驱动器,然后是每个驱动器中的文件夹,然后是每个文件夹的子文件夹,依此类推,直到每个驱动器中的最后一个可能的级别 C语言。。Windows平台。。我曾尝试将字母数组与system()一起使用,但无法获取文件和文件夹的名称。标准C无法直接寻址驱动器,甚至不知道驱动器是什么 一般来说,每个C编译器供应商都会包含一个库,用于为编译器编写的特定平台处理这些事情。但这些都是特定于供应商的 具有C++的跨平台库,包括用于处理文件系统的.
C语言。。Windows平台。。我曾尝试将字母数组与
system()
一起使用,但无法获取文件和文件夹的名称。标准C无法直接寻址驱动器,甚至不知道驱动器是什么
一般来说,每个C编译器供应商都会包含一个库,用于为编译器编写的特定平台处理这些事情。但这些都是特定于供应商的
具有C++的跨平台库,包括用于处理文件系统的.< /P> < P>标准C没有直接处理驱动器的能力,或者,甚至知道驱动器是什么。 一般来说,每个C编译器供应商都会包含一个库,用于为编译器编写的特定平台处理这些事情。但这些都是特定于供应商的
具有C++的跨平台库,包括用于处理文件系统的.< /P> < P>这不是“标准C”(即:ANSI、C89、C99等),但它很少使用操作系统特定的调用(即:“Windows .h”,而不是MS.NET或MFC技术)。这是你尝试做的最简单的方法。一旦有了所有驱动器盘符的列表,就需要递归地查询每个驱动器的目录列表
这是C和C++的混合,但你可能会使用Visual Studio的免费版本来构建它。 代码列表-获取驱动器号
#包括
#包括
int main()
{
char-buf[255];
//将驱动器号作为一组字符串获取
int sz=GetLogicalDriveStrings(sizeof(buf),buf);
如果(sz>0)
{
//buf现在包含所有驱动器号的列表。每个驱动器号
//以“\0”终止,最后一个以两个连续的“\0”字节终止。
char*p1=buf;
char*p2;
而(*p1!='\0'&&(p2=strchr(p1,'\0'))!=NULL)
{
printf(“%s\n”,p1);
p1=p2+1;
}
}
其他的
{
//哎呀!出现了问题,请显示错误消息
DWORD dwError=GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,dwError,0,buf,sizeof(buf),0);
printf(“%s\n”,buf);
}
}
代码列表-目录列表
#包括
#包括
#包括
#包括
#pragma注释(lib,“User32.lib”)
无效显示错误框(LPTSTR LPSZ功能);
int_tmain(int argc,TCHAR*argv[])
{
WIN32_查找_数据ffd;
大整数文件大小;
TCHAR szDir[MAX_PATH];
参数的大小和长度;
句柄hFind=无效的句柄值;
DWORD dwError=0;
//如果未将目录指定为命令行参数,
//打印使用。
如果(argc!=2)
{
_tprintf(文本(“\n用法:%s\n”),argv[0]);
返回(-1);
}
//检查输入路径加3是否不长于最大路径。
//三个字符表示“\*”加上下面附加的NULL。
字符串长度(argv[1]、最大路径和长度);
if(参数的长度>(最大路径-3))
{
_tprintf(文本(“\n目录路径太长。\n”);
返回(-1);
}
_tprintf(文本(“\n目标目录为%s\n\n”),argv[1]);
//准备用于FindFile函数的字符串。首先,复制
//字符串添加到缓冲区,然后将“\*”追加到目录名。
StringCchCopy(szDir,MAX_PATH,argv[1]);
StringCchCat(szDir,最大路径,文本(“\\*”);
//查找目录中的第一个文件。
hFind=FindFirstFile(szDir和ffd);
if(无效的句柄值==hFind)
{
显示错误框(文本(“FindFirstFile”);
返回dwError;
}
//列出目录中的所有文件及其相关信息。
做
{
if(ffd.dwFileAttributes和文件属性目录)
{
_tprintf(文本(“%s\n”),ffd.cFileName);
}
其他的
{
filesize.LowPart=ffd.nFileSizeLow;
filesize.HighPart=ffd.nFileSizeHigh;
_tprintf(文本(“%s%ld字节\n”)、ffd.cFileName、filesize.QuadPart);
}
}
while(FindNextFile(hFind,&ffd)!=0);
dwError=GetLastError();
if(dwError!=错误\u无\u更多\u文件)
{
显示错误框(文本(“FindFirstFile”);
}
FindClose(hFind);
返回dwError;
}
无效显示错误框(LPTSTR LPSZ函数)
{
//检索最后一个错误代码的系统错误消息
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw=GetLastError();
格式化消息(
格式化消息分配缓冲区
格式化来自\u系统的\u消息\u|
格式化\u消息\u忽略\u插入,
无效的
dw,
MAKELANGID(LANG_中立,SUBLANG_默认),
(LPTSTR)和lpMsgBuf,
0,空);
//显示错误消息并清除
lpDisplayBuf=(LPVOID)LocalAlloc(LMEM_zeronit,
(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf)/sizeof(TCHAR),
文本(“%s失败,错误为%d:%s”),
lpsz函数、dw、lpMsgBuf);
消息框(空,(LPCTSTR)lpDisplayBuf,文本(“错误”),MB_OK);
本地免费(lpMsgBuf);
LocalFree(lpDisplayBuf);
}
参考资料
#include <windows.h>
#include <stdio.h>
int main()
{
char buf[255];
// get the drive letters as a set of strings
int sz = GetLogicalDriveStrings(sizeof(buf), buf);
if( sz > 0)
{
// buf now contains a list of all the drive letters. Each drive letter is
// terminated with '\0' and the last one is terminated by two consecutive '\0' bytes.
char* p1 = buf;
char* p2;
while( *p1 != '\0' && (p2 = strchr(p1,'\0')) != NULL )
{
printf("%s\n", p1);
p1 = p2+1;
}
}
else
{
// Oops! something went wrong so display the error message
DWORD dwError = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwError, 0, buf, sizeof(buf), 0);
printf("%s\n", buf);
}
}
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#pragma comment(lib, "User32.lib")
void DisplayErrorBox(LPTSTR lpszFunction);
int _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
TCHAR szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;
// If the directory is not specified as a command-line argument,
// print usage.
if(argc != 2)
{
_tprintf(TEXT("\nUsage: %s <directory name>\n"), argv[0]);
return (-1);
}
// Check that the input path plus 3 is not longer than MAX_PATH.
// Three characters are for the "\*" plus NULL appended below.
StringCchLength(argv[1], MAX_PATH, &length_of_arg);
if (length_of_arg > (MAX_PATH - 3))
{
_tprintf(TEXT("\nDirectory path is too long.\n"));
return (-1);
}
_tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]);
// Prepare string for use with FindFile functions. First, copy the
// string to a buffer, then append '\*' to the directory name.
StringCchCopy(szDir, MAX_PATH, argv[1]);
StringCchCat(szDir, MAX_PATH, TEXT("\\*"));
// Find the first file in the directory.
hFind = FindFirstFile(szDir, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
{
DisplayErrorBox(TEXT("FindFirstFile"));
return dwError;
}
// List all the files in the directory with some info about them.
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" %s <DIR>\n"), ffd.cFileName);
}
else
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
}
}
while (FindNextFile(hFind, &ffd) != 0);
dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
DisplayErrorBox(TEXT("FindFirstFile"));
}
FindClose(hFind);
return dwError;
}
void DisplayErrorBox(LPTSTR lpszFunction)
{
// Retrieve the system error message for the last-error code
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
// Display the error message and clean up
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
TEXT("%s failed with error %d: %s"),
lpszFunction, dw, lpMsgBuf);
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
}