草庐IT

关于 c :GetCurrentDirectory() 只检索磁盘名称

codeneng 2023-03-28 原文

GetCurrentDirectory() only retrieve disk name

本问题已经有最佳答案,请猛点这里访问。

我一直在做一些 C 编程,但偶然发现了一个奇怪的行为,
每当我尝试使用 GetCurrentDirectory() 获取当前目录时,它只会返回当前磁盘的字母。

这是代码:

TCHAR path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectory(MAX_PATH, path);

cout << (char *)path;

这是输出:

Z

因为我的项目在我的 Z:\\\\ 磁盘中

我想知道它是否与缓冲区大小有关,但我将其设置为 MAX_PATH,甚至尝试将其设置为 1024。

  • 什么是预期的输出?你在哪个目录运行你的程序?
  • 我试图把它放在桌面上的 C:\\\\\\\\ 目录中,它也只检索到 C 字母,所以完整路径应该像 C:\\\\\\\\Users\\\\\\\\XXX\\\\\\\\Desktop
  • 你在 UNICODE 模式下编译你的程序。使用 wcout 而不是 cout。并且不要使用 TCHAR 类型,而是使用 w_char 。实际上 (char *) 演员是这里的罪魁祸首。 TCHAR 类型仅在您要将代码编译为 UNICODE 字符集程序或多字节字符集程序时才有用,后者现在已过时。
  • 如果您只使用副本,您的输出会更好地阅读
  • cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t

    你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):

    char path[MAX_PATH + 1] ="";
    DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
    cout << path;

    或者这个(推荐):

    wchar_t path[MAX_PATH + 1] = L"";
    DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
    wcout << path;
  • cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t

    你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):

    char path[MAX_PATH + 1] ="";
    DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
    cout << path;

    或者这个(推荐):

    wchar_t path[MAX_PATH + 1] = L"";
    DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
    wcout << path;


cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t

你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):

char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path;

或者这个(推荐):

wchar_t path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
wcout << path;

  • 谢谢它的工作,不知道有一个多字节版本
  • @Quentin_otd 只是忘记了 TCHAR 和其他 _tstrlen_T("foo") 等。它们仅存在,因此您可以将代码编译为 UNICODE 或多字节程序。
  • w_char 应该是 wchar_t 或 WinAPI WCHAR。此外,如果未启用长路径,则 MAX_PATH 缓冲区就足够了,因为 SetCurrentDirectory 仅限于 MAX_PATH - 1 字符,包括所需的尾部斜杠。但是,您仍然应该进行防御性编码,以防进程启用了长路径或出现错误。检查返回值是否大于零且小于 MAX_PATH
  • @ErykSun 谢谢,我纠正了错字。您关于长路径的评论是正确的。

有关关于 c :GetCurrentDirectory() 只检索磁盘名称的更多相关文章

  1. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  2. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  3. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  4. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  5. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

  6. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  7. ruby-on-rails - ActiveAdmin 自定义选择过滤器下拉名称 - 2

    对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking

  8. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  9. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  10. ruby - 将 Logstash 中的时间戳时区转换为输出索引名称 - 2

    在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已

随机推荐