【问题标题】:C/C++ Determine Drive a program is running onC/C++ 确定程序正在运行的驱动器
【发布时间】:2009-07-10 07:00:57
【问题描述】:

在我的代码中识别闪存驱动器时遇到问题。

幸运的是,我的代码可以从闪存驱动器运行。那么在 C(或 C++)中有没有办法告诉程序正在运行的驱动器号(或驱动器名称)?

我需要知道的原因是,当我插入 USB 驱动器时,它正在运行一个将文件从计算机复制到 USB 驱动器本身的程序。

【问题讨论】:

  • 你在哪个操作系统上开发?
  • 为什么不使用搜索?几个小时前有人问了非常相似的问题 (stackoverflow.com/questions/1105968/…)。
  • @qrdl - 2 个问题标题中的所有术语都没有重叠,因此如果不使用完全不同的术语,OP 就无法找到该问题。

标签: c++ c winapi


【解决方案1】:

GetModuleFileName可以帮你查到驱动号,如下:

TCHAR ExeName[MAX_PATH];
GetModuleFileName(NULL, ExeName, MAX_PATH);
TCHAR DriveLetter = ExeName[0];

您可能会发现GetDriveType API 也很有用。

【讨论】:

  • 请注意,这不能保证正常工作。 GetModuleFileName 可能返回一个短文件名或长文件名,因此可能以 `\\?` 开头,位于卷号(或 UNC 引用)之前。在这种情况下,第一个字符将是“\”。
【解决方案2】:

您可以使用 ISO C++ _getcwd 函数来获取应用程序的当前工作目录,如下所示:

#include <direct.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char buf[255];
    _getcwd(buf,255);
    printf("%c",buf[0]);
    return 0;
}

char 数组 buf 将包含您的可执行文件的路径,并且 buf[0] 应该只为您提供驱动器的盘符。

【讨论】:

  • nitpick:getcwd() 不是 ISO 标准。 getcwd() 是 POSIX 的一部分; MS 添加了一个“”前缀,因为他们认为 POSIX 标准不足以包含在没有“实现定义的名称”前缀的 CRT 中。
  • 此外,当前工作目录不一定是应用程序映像所在的目录(但是根据程序的行为方式,当前目录可能比应用程序目录更适合使用)。
  • 它不符合标准。我从来没有在我的帖子中使用过标准这个词。
  • ISO 是国际标准组织,所以您实际上确实提到了它,也许是无意的。微软称其为“符合”的原因是因为 ISO C++ 保留 _[a-z].* 用于实现扩展。所以 _getcwd 是标准的一致扩展,而不是 ISO C++ 的一部分。
【解决方案3】:

在你的 C/C++ 程序的某个地方你应该有一个 main

像 int main(int argc, char** argv)

argv 的第一个参数保存应用程序的路径

编辑:

这在 Windows 和 Linux 之间是不同的。以下程序输出因平台而异:

#include <iostream>

int main(int argc, char** argv) {

    std::cout << argv[0] << std::endl;
    return 0;
}

在 Windows 上:(Visual Studio 2015)

C:\ConsoleApplication1\Debug\ConsoleApplication1.exe

在 Linux 上:(使用带有 g++ 的在线编译器)

主要

我猜想使用的确切编译器无关紧要,因为提供这些参数是操作系统的工作。

【讨论】:

  • 第一个参数实际上包含应用程序名称,而不是它的完整路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多