- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
GetModuleFileName()
将缓冲区和缓冲区大小作为输入;然而它的返回值只能告诉我们复制了多少个字符,以及大小是否不够(ERROR_INSUFFICIENT_BUFFER
)。
如何确定为 GetModuleFileName()
保存整个文件名所需的实际缓冲区大小?
大多数人使用 MAX_PATH
但我记得路径可以超过那个(默认定义为 260)...
(使用零作为缓冲区大小的技巧不适用于此 API - 我之前已经尝试过)
最佳答案
通常的方法是调用它,将大小设置为零,保证失败并提供分配足够缓冲区所需的大小。分配一个缓冲区(不要忘记空终止的空间)并第二次调用它。
很多情况下MAX_PATH
就足够了,因为许多文件系统限制路径名的总长度。但是,可以构造出超过 MAX_PATH
的合法且有用的文件名。 , 因此查询所需缓冲区可能是个好建议。
不要忘记最终从提供缓冲区的分配器返回缓冲区。
编辑:Francis 在评论中指出,通常的配方不适用于GetModuleFileName()
。
。不幸的是,Francis 在这一点上是绝对正确的,我唯一的借口是我在提供“常规”解决方案之前没有去查证它。
我不知道那个 API 的作者在想什么,除了有可能在引入它时,MAX_PATH
确实是最大的可能路径,使正确的食谱变得容易。只需在长度不小于 MAX_PATH
的缓冲区中进行所有文件名操作即可字符。
哦,是的,不要忘记自 1995 年左右以来的路径名允许使用 Unicode 字符。因为 Unicode 占用更多空间,所以任何路径名前面都可以加上 \\?\
明确要求 MAX_PATH
对该名称的字节长度的限制被删除。这使问题复杂化。
MSDN 在标题为 File Names, Paths, and Namespaces 的文章中对路径长度有这样的说法:
Maximum Path Length
In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is
MAX_PATH
, which is defined as 260 characters. A local path is structured in the following order: drive letter, colon, backslash, components separated by backslashes, and a terminating null character. For example, the maximum path on drive D is "D:\<some 256 character path
" where "
string><NUL><NUL>
" represents the invisible terminating null character for the current system codepage. (The characters<
>
are used here for visual clarity and cannot be part of a valid path string.)Note File I/O functions in the Windows API convert "
/
" to "\
" as part of converting the name to an NT-style name, except when using the "\\?\
" prefix as detailed in the following sections.The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters. This type of path is composed of components separated by backslashes, each up to the value returned in the
lpMaximumComponentLength
parameter of theGetVolumeInformation
function. To specify an extended-length path, use the "\\?\
" prefix. For example, "\\?\D:\<very long path>
". (The characters<
>
are used here for visual clarity and cannot be part of a valid path string.)Note The maximum path of 32,767 characters is approximate, because the "
\\?\
" prefix may be expanded to a longer string by the system at run time, and this expansion applies to the total length.The "
\\?\
" prefix can also be used with paths constructed according to the universal naming convention (UNC). To specify such a path using UNC, use the "\\?\UNC\
" prefix. For example, "\\?\UNC\server\share
", where "server" is the name of the machine and "share" is the name of the shared folder. These prefixes are not used as part of the path itself. They indicate that the path should be passed to the system with minimal modification, which means that you cannot use forward slashes to represent path separators, or a period to represent the current directory. Also, you cannot use the "\\?\
" prefix with a relative path, therefore relative paths are limited toMAX_PATH
characters as previously stated for paths not using the "\\?\
" prefix.When using an API to create a directory, the specified path cannot be so long that you cannot append an 8.3 file name (that is, the directory name cannot exceed
MAX_PATH
minus 12).The shell and the file system have different requirements. It is possible to create a path with the Windows API that the shell user interface might not be able to handle.
所以一个简单的答案是分配一个大小为 MAX_PATH
的缓冲区, 检索名称并检查错误。如果合适,你就完成了。否则,如果它以“\\?\
”开头,得到一个大小为 64KB 左右的缓冲区(上面的短语“32,767 个字符的最大路径是近似的”在这里有点麻烦所以我留下一些细节以供进一步研究)和再试一次。
溢出 MAX_PATH
但不是以“\\?\
”开头似乎是“不可能发生”的情况。同样,接下来要做什么是您必须处理的细节。
对于以“\\Server\Share\
”开头的网络名称,路径长度限制是多少可能会有一些混淆,更不用说内核对象 namespace 中以“\\.\
”开头的名称了。上面的文章没有说,我也不确定这个API能不能返回这样的路径。
关于windows - 如何计算 GetModuleFileName 的完整缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/805814/
具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Commons Net(commons-net-3.3.jar)
我在日志文件中收到这些警告: WARN 2013-01-15 00:08:15,550 org.eclipse.jetty.http.HttpParser- HttpParser Full for
我在使用特定网页时遇到问题。当我按下链接时,我收到应用程序错误(不是 http 错误等,而是应用程序级别错误)。 但是我打开了开发人员工具和网络控制台,我看到没有请求发送到服务器。 所以我双击并选择查
我没有组装经验,但这是我一直在做的。如果在通过程序集中的指针传递参数和调用函数时缺少任何基本方面,我希望输入。 例如,我想知道是否应该还原ecx,edx,esi,edi,。我读到它们是通用寄存器,但我
我没有组装经验,但这是我一直在做的。如果在通过程序集中的指针传递参数和调用函数时缺少任何基本方面,我希望输入。 例如,我想知道是否应该还原ecx,edx,esi,edi,。我读到它们是通用寄存器,但我
我正在尝试创建完整 uiscrollview 的快照,所有内容大小,我已经搜索了很多,并且我在 SO 上找到了一些东西,如下所示: Getting a screenshot of a UIScroll
我想复制一个包含以下结构的Vector,对我来说重要的是在修改复制的 vector 时保持原始Vector完整: public class objet_poid_n { public int
给定一个示例字符串 s = '嗨,我的名字是 Humpty-Dumpty,来自“爱丽丝,爱丽丝镜中奇遇记”',我想将其分成以下 block : # To Do: something like {l =
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试创建一个正则表达式来查找文本中的 Linux 文件路径,但是正则表达式对我来说非常陌生。我有下面的代码片段,它将识别下面文件结构的开头。 .*(/bin/|/home/).* 完成正则表达式
我正在寻找远程托管的 JPG 的尺寸、宽度和高度。我已经了解了如何通过下载完整图像来执行此操作。 但是,如果我可以通过仅下载足以获取此信息的方式来做到这一点,那将是理想的。 典型的图像大小为 200K
有没有办法让下面的代码: import traceback def log(message): print "%s: %s" %(traceback.extract_stack()[0:-1]
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
git show 显示了修订版中所做的所有更改。但是,它会打印出所有更改——而不仅仅是文件名。 git show --stat 只显示文件名,但它把它们截断了!有没有办法获得已更改文件名的完整列表?
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
当我在模板中调用我的模型 get_absolute_url 方法时,我想要一个绝对/完整的 url。在我的入门模型中,我有以下内容: def get_absolute_url(self): r
我正在使用 jQuery 1.5.1 这是我的代码: $('.cellcontent').animate({ left: '-=190'}, { easing: alert('start
我正在使用下面的方法删除条形图并使用新数据更新条形图,但这样做时出现了一个小故障/完整的图表消失 1 秒,直到加载新数据。但是是否可以通过仅增加/减少柱形而不实际消失图表来实现相同的目的。 d3.se
基于 this question 中的讨论,任何人都可以提供代码或代码链接,显示 NumericLiteralX 模块的完整实现(例如 this one )?我对 NumericLiteralX 模块
我的目标是检索网站的 html,并将其转换为可读的String。我下面的代码可以工作,但我遇到了一个技术问题:当我尝试检索 http://time.gov/HTML5 的 html 时,我在 andr
我是一名优秀的程序员,十分优秀!