Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取C中所有驱动器的列表_C_Windows_File - Fatal编程技术网

如何获取C中所有驱动器的列表

如何获取C中所有驱动器的列表,c,windows,file,C,Windows,File,是否有任何方法可以让我列出所有可用的驱动器及其文件夹内容。ie我想访问所有驱动器,然后是每个驱动器中的文件夹,然后是每个文件夹的子文件夹,依此类推,直到每个驱动器中的最后一个可能的级别 C语言。。Windows平台。。我曾尝试将字母数组与system()一起使用,但无法获取文件和文件夹的名称。标准C无法直接寻址驱动器,甚至不知道驱动器是什么 一般来说,每个C编译器供应商都会包含一个库,用于为编译器编写的特定平台处理这些事情。但这些都是特定于供应商的 具有C++的跨平台库,包括用于处理文件系统的.

是否有任何方法可以让我列出所有可用的驱动器及其文件夹内容。ie我想访问所有驱动器,然后是每个驱动器中的文件夹,然后是每个文件夹的子文件夹,依此类推,直到每个驱动器中的最后一个可能的级别


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);
}
参考资料


  • 列出Windows逻辑驱动器号,访问日期2014-08-01
  • 列出目录中的文件,访问2014-08-01
  • 这不是“标准C”(即ANSI、C89、C99等),但它很少使用操作系统特定的调用(即:只使用“windows.h”,而不是MS.NET或MFC技术)。这是你尝试做的最简单的方法。一旦有了所有驱动器号的列表,就需要查询每个dri
    #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);
    }