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

奥修·帕斯

有什么方法可以用来列出所有可用的驱动器及其文件夹内容。即我要访问所有驱动器,然后访问每个驱动器中的文件夹,然后访问每个文件夹的子文件夹,依此类推,直到访问每个驱动器中的最后一个级别。

C语言.. Windows平台..我已尝试将字母数组与结合使用,system()但无法获取文件和文件夹的名称。

这不是“标准C”(即ANSI,C89,C99等),但是它很少使用特定于操作系统的调用(即:仅“ windows.h”,而不是MS .NET或MFC技术)。这是您尝试做的极简主义方法。获得所有驱动器号的列表后,您需要递归查询每个驱动器的目录列表。

这是C和C ++的混合,但是您可能仍会使用Visual Studio的免费版本来构建它。

代码清单-获取驱动器号


#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);
}

参考文献


  1. 列出Windows逻辑驱动器号,已访问2014-08-01,<http://www.daniweb.com/software-development/c/code/237803/list-windows-logical-drive-letters>
  2. 列出目录中的文件,已访问2014-08-01,<http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

所有物理驱动器的列表

来自分类Dev

如何获取Qt C ++中所有可用主题的列表?

来自分类Dev

如何获取没有父母的Google驱动器中的所有文件?

来自分类Dev

获取驱动器中的所有项目名称

来自分类Dev

如何使用golang获取Windows上所有驱动器的清单?

来自分类Dev

如何获取孤立的驱动器文件列表

来自分类Dev

如何合并USB闪存驱动器的所有分区?

来自分类Dev

如何让 ListBox 显示驱动器中的所有文件?

来自分类Dev

如何获取Openfire服务器中所有房间的列表

来自分类Dev

如何获取Openfire服务器中所有房间的列表

来自分类Dev

如何获取RethinkDB表中所有文档中所有键的列表?

来自分类Dev

如何获取DocumentDB文档中所有集合的列表?

来自分类Dev

如何获取Python中所有内置函数的列表?

来自分类Dev

如何获取Laravel中所有型号的列表?

来自分类Dev

如何获取Yocto中所有可用目标的列表?

来自分类Dev

如何获取Powershell中所有Azure VM的列表

来自分类Dev

如何获取matplotlib中所有标记的列表?

来自分类Dev

如何获取Linux中所有打开的命名管道的列表?

来自分类Dev

如何获取Play商店中所有热门应用的列表

来自分类Dev

如何获取Dart中所有已加载库的列表?

来自分类Dev

如何获取Zathura中所有书签的列表

来自分类Dev

如何获取Xorg中所有窗口的列表?

来自分类Dev

如何使用asp.net 4获取C#中所有可用的Com端口的列表

来自分类Dev

我如何从Mono中的c ++获取某个类中所有方法的列表?

来自分类Dev

如何使用Lua C API获取.lua脚本中所有表名的列表?

来自分类Dev

如何使用asp.net 4获取C#中所有可用的Com端口的列表

来自分类Dev

使用python re sub将映射驱动器k:/和K:\替换为驱动器中所有文件中的unc路径

来自分类Dev

如何将所有文件从驱动器 A 移动到驱动器 B?(Ubuntu 服务器)

来自分类Dev

我如何获取带有远程Websphere应用程序服务器中所有队列名称的列表?

Related 相关文章

  1. 1

    所有物理驱动器的列表

  2. 2

    如何获取Qt C ++中所有可用主题的列表?

  3. 3

    如何获取没有父母的Google驱动器中的所有文件?

  4. 4

    获取驱动器中的所有项目名称

  5. 5

    如何使用golang获取Windows上所有驱动器的清单?

  6. 6

    如何获取孤立的驱动器文件列表

  7. 7

    如何合并USB闪存驱动器的所有分区?

  8. 8

    如何让 ListBox 显示驱动器中的所有文件?

  9. 9

    如何获取Openfire服务器中所有房间的列表

  10. 10

    如何获取Openfire服务器中所有房间的列表

  11. 11

    如何获取RethinkDB表中所有文档中所有键的列表?

  12. 12

    如何获取DocumentDB文档中所有集合的列表?

  13. 13

    如何获取Python中所有内置函数的列表?

  14. 14

    如何获取Laravel中所有型号的列表?

  15. 15

    如何获取Yocto中所有可用目标的列表?

  16. 16

    如何获取Powershell中所有Azure VM的列表

  17. 17

    如何获取matplotlib中所有标记的列表?

  18. 18

    如何获取Linux中所有打开的命名管道的列表?

  19. 19

    如何获取Play商店中所有热门应用的列表

  20. 20

    如何获取Dart中所有已加载库的列表?

  21. 21

    如何获取Zathura中所有书签的列表

  22. 22

    如何获取Xorg中所有窗口的列表?

  23. 23

    如何使用asp.net 4获取C#中所有可用的Com端口的列表

  24. 24

    我如何从Mono中的c ++获取某个类中所有方法的列表?

  25. 25

    如何使用Lua C API获取.lua脚本中所有表名的列表?

  26. 26

    如何使用asp.net 4获取C#中所有可用的Com端口的列表

  27. 27

    使用python re sub将映射驱动器k:/和K:\替换为驱动器中所有文件中的unc路径

  28. 28

    如何将所有文件从驱动器 A 移动到驱动器 B?(Ubuntu 服务器)

  29. 29

    我如何获取带有远程Websphere应用程序服务器中所有队列名称的列表?

热门标签

归档