微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GetShortPathName不可预知的结果

GetShortPathName()在XP SP3上不能正常工作

http://msdn.microsoft.com/en-us/library/aa364989(VS.85).aspx

返回path的inputstring,如:

C:TestLongFolderNametoTestWithBinarySearch.ini

完全一样发送?

Windows Azure支持除.NET以外的其他技术

Python 2.7.11 pip没有安装

DirectoryInfo.GetFiles()不返回所有文件

当间谍程序++不提供任何细节从软件提取时该怎么办?

文件复制进度栏不更新。 文件复制工作正常

然而:

C:Documents and SettingsLocalServiceNTUSER.DAT

是否为path做短名称,所以我知道我正确调用API。

然而:

C:Documents and SettingsLocalServiceBinarySearch.ini

不要从文件名中做一个简短的名字,但是为path做简短的名字!?

有人可以帮我理解这种行为,也许build议一个解决方法

添加

我需要能够将8.3path/文件名传递给旧版应用程序

如何才能做到这一点?

增加解决scheme

经过多次阅读/试验,似乎唯一可靠的方法就是使用自动化:

' ------------------------------------------------------------ ' Library Name: Microsoft Scripting Runtime 1.0 ' Library File: C:WINDOWSsystem32scrrun.dll ' ------------------------------------------------------------ ' Version Info: ' ------------- ' Company Name: Microsoft Corporation ' File Description: Microsoft (R) Script Runtime ' File Version: 5.7.0.16599 ' Internal Name: scrrun.dll ' Legal copyright: copyright (C) Microsoft Corp. 1996-2006,All Rights Reserved ' Original Filename: scrrun.dll ' Product Name: Microsoft (R) Script Runtime ' Product Version: 5.7.0.16599 ' ------------------------------------------------------------ ' ProgID: Scripting.FileSystemObject ' Interface Name: ScriptingFileSystemObject ' ' Interface Prefix: Scripting

这工作。

在BASIC中的简单实现将是:

$PROGID_ScriptingFileSystemObject = "Scripting.FileSystemObject" Interface dispatch ScriptingFileSystemObject Member CALL GetFile <&H0000271C>(IN FilePath AS STRING<&H00000000>) AS ScriptingIFile Member CALL GetFolder<&H0000271D>(IN FolderPath AS STRING<&H00000000>) AS ScriptingIFolder END Interface Interface dispatch ScriptingFile Member GET ShortPath<&H000003EA>() AS STRING Member GET ShortName<&H000003E9>() AS STRING END Interface Interface dispatch ScriptingFolder Member GET ShortPath<&H000003EA>() AS STRING Member GET ShortName<&H000003E9>() AS STRING END Interface '----------------------------------------------------------------------------- FUNCTION FileShortPath( BYVAL sPathnFile AS STRING,sShort AS STRING ) AS LONG LOCAL vResult,vFilePath AS Variant LOCAL fso AS ScriptingFileSystemObject LOCAL oFile AS ScriptingFile IF LEN(sPathnFile) = 0 THEN EXIT FUNCTION ' nothing sent SET fso = NEW ScriptingFileSystemObject IN $PROGID_ScriptingFileSystemObject IF Isnothing(fso) THEN FUNCTION = -1 : EXIT FUNCTION SET oFile = NEW ScriptingFile IN $PROGID_ScriptingFileSystemObject IF Isnothing(oFile) THEN FUNCTION = -2 : EXIT FUNCTION vFilePath = sPathnFile vResult = Empty OBJECT CALL fso.GetFile(vFilePath) TO vResult SET oFile = vResult IF Isnothing(oFile) THEN FUNCTION = -3 : EXIT FUNCTION vResult = Empty Object GET oFile.ShortName TO vResult sShort = VARIANT$(vResult) vResult = Empty Object GET oFile.ShortPath TO vResult sShort = VARIANT$(vResult) IF LEN(sShort) THEN FUNCTION = 1 ' Success END FUNCTION

谢谢大家的build议。

我仍然试图find一种可靠的方式来创build一个8.3path/文件名。

除了使用GETSHORTPATHNAME之外,还有什么办法可以做到吗?

解决了。 往上看

似乎MS继续支持这个只为COM deciples …为什么现在在C API不可靠仍然是一个谜。

Windows错误地认为cx_freeze冻结应用程序已经崩溃,当它只是结束

谷歌地图多点触摸捏和缩放(桌面)触摸电脑

我怎样才能让光盘在DVD ROM驱动器中旋转?

Node.js – 按文件types查找shell图标(windows)

C#启动应用程序进程而不偷窃重点

这是因为文件名不存在短名称,XP SP3不会自动为该文件创建简短名称

您可以检查此注册表设置(如果存在)以查看当前设置为。

HKEY_LOCAL_MACHINE 系统 CurrentControlSet 控制 FileSystem的找到Ntfsdisable8dot3NameCreation

当Ntfsdisable8dot3NameCreation设置为1时,您将获得以下行为:

如果一个文件夹/文件已经有一个名称,例如“Program Files”,那么它将返回该文件夹/文件的短名称。 但是,如果短名称不存在,您将取而代之为文件的长名称,因为它是该对象的唯一名称。 如果短名称被禁用,则没有短名称可以获得。

根据前面引用的文档,只有在Ntfsdisable8dot3NameCreation为0时才会生成名称。如果值已更改,则可能只有一些文件/目录只有长名称。 这可以解释为什么您对GetShortPathName的调用可以使用短名称文件的长名称

我一直无法证实这一点,但我怀疑在Windows中可能有特殊的逻辑,总是会为“Documents and Settings”等关键目录创建短名称,因为如果没有这样做,某些古代程序可能会中断。

你有没有试过SetFileShortName ?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐