注意:我已将目录替换为a
,将exe替换为b.exe
,我会重复我所做的每项测试,以确保它不是打字语法。
我有一个非常简单的部分代码,可以从Windows XP到Windows 7完美运行。
var processPath = @"c:\a\b.exe" ; // this exe exists on my computer
Process.Start(processPath);
以及
Directory.Exists(@"c:\a\") returns false on Windows 10.
由于Windows 10(我尚未测试8和8.1),第一个代码将抛出System.ComponentModel.Win32Exception
(“未找到指定文件”),第二个代码将返回false。 。
我也注意到当我使用Windows运行窗口(Windows Key + R)运行“c:\ a \ b.exe”时,它的行为相同。
是否有解决此问题的解决方法?优先考虑的是一种不需要重新编译的解决方案。
NB :
c:\b.exe
有效!! 谢谢大家,
编辑:
a
目录和b.exe
)Console.WriteLine(String.Join("\r\n", Directory.GetDirectories(@"c:\")))
显示目录c:\a
更新:
icalcs c:\a\
的结果:
c:\a\ Tout le monde:(OI)(CI)(F)
BUILTIN\Administrateurs:(I)(OI)(CI)(F)
AUTORITE NT\SystŠme:(I)(OI)(CI)(F)
BUILTIN\Utilisateurs:(I)(OI)(CI)(RX)
AUTORITE NT\Utilisateurs authentifi‚s:(I)(M)
AUTORITE NT\Utilisateurs authentifi‚s:(I)(OI)(CI)(IO)(M)
icalcs c:\a\b.exe
的结果:
c:\a\b.exe Tout le monde:(I)(F)
BUILTIN\Administrateurs:(I)(F)
AUTORITE NT\SystŠme:(I)(F)
BUILTIN\Utilisateurs:(I)(RX)
AUTORITE NT\Utilisateurs authentifi‚s:(I)(M)
“Tout le monde”意味着每个人。
更新:
关于最新消息,我能做到:
File.WriteAllBytes(@"c:\a\b.exe", somebinaries) ;
但是我无法做到
FileInfo fileInfo = new FileInfo(@"c:\a\b.exe") ;
投掷'System.NotSupportedException'。 StackTrace如下:
à System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
à System.IO.FileInfo.Init(String fileName, Boolean checkHost)
à System.IO.FileInfo..ctor(String fileName)
à ConsoleApplication1.Program.Main(String[] args) dans F:\MAPW10\Development\Sources\Tools\ConsoleApplication1\Program.cs:ligne 22
à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:4)
从 Windows 10资源管理器中的某些标签复制/粘贴时,文件路径中添加了一些额外的不可打印字节。
考虑这段代码:
Console.WriteLine(new DirectoryInfo(@"c:\a\"));
Console.WriteLine(new DirectoryInfo(@"c:\a\"));
这些行看起来相同,不应引发任何异常(即使目录c:\a
不存在),但实际上如果您在应用程序中复制/粘贴上面的代码,第二行将引发{{1使用单词:“不支持给定路径的格式”。
我最终检查了.NET源代码,发现方法StringExpressionSet.Canonicalize引发了NotSupportedException:
NotSupportedException
实际上:
...
if (path.IndexOf( ':', 2 ) != -1)
throw new NotSupportedException( Environment.GetResourceString( "Argument_PathFormatNotSupported" ) );
...
为了不犯任何打字错误,我习惯将目录路径从右键单击复制到文件 - > Console.WriteLine(@"c:\a\".IndexOf( ':', 2 )); // results -1
Console.WriteLine(@"c:\a\".IndexOf( ':', 2 )); // result 2
// Copy/Paste to test
- > Properties
您现在被警告!
答案 1 :(得分:1)
...SystŠme
...authentifi‚s
模糊目录和文件名使您很难帮助您。但是,有一个明显的摇滚可以看下,让重音人物严重受损,这样就不应该发生。该机器使用法语,但似乎使用的编码为1250,仅在东欧使用。一个非常奇怪的不匹配,特别是对于控制台模式应用程序。
如果真实的 a
目录同样包含带有变音符号的字符,那么受损的icalcs.exe程序输出背后的任何根本原因也会影响文件系统名称编码。最后的结论是,这台机器非常恶心,需要极客小组的帮助才能变得更好。