DirectoryInfo.GetFiles方法不返回任何文件

时间:2012-02-28 16:08:20

标签: c# fileinfo directoryinfo system.io.fileinfo

我试图返回.config中存在的%WINDIR%\System32\inetsrv\config个文件。

为此,我使用以下代码:

DirectoryInfo configFolder = new DirectoryInfo(Environment.ExpandEnvironmentVariables("%WINDIR%") + @"\System32\inetsrv\");
FileInfo[] configFiles = configFolder.GetFiles("*.config");

这会将零对象返回configFiles。如果我使用另一个文件夹(比如说D:\ DropBox)工作正常!

这段代码用来工作,有些变化吗?

此外,FileInfo fi = new FileInfo(Path.Combine(configPath, "applicationHost.config"));返回正常,但fi.Length会抛出FileNotFoundException

似乎它必须是权限,但我无法看到如何在代码运行时检查我是否拥有权限!

3 个答案:

答案 0 :(得分:2)

您需要使用提升的权限运行代码,因为您尝试访问asystem文件夹。

如果您使用Windows资源管理器检查它 - >属性 - >安全性你会发现该文件夹限制对SYSTEM,Administrators和TrustedInstaller的访问(不知道最后一个来自哪里,也可能只在我的机器上......)。

您可以在App.config文件中配置执行级别,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

您可以在此处找到一篇文章:How To Force C# Application To Only Run As Administrator In Windows

答案 1 :(得分:2)

由于我不是开发人员,而且我只涉及代码(主要是为自己编写管理工具),我想知道是否有人可以向我解释或指出正确的答案位置?

基本上,我从别人的项目中获得了一些代码,并将其复制到我自己的项目中。我很确定它之前有用,但不能100%肯定。那时我正在运行x86 Windows,但我现在使用的是x64。

旧代码仍然有用,所以我复制了设置并最终找到了解决方案。

Project的{​​{1}}到Build properties(来自x86)中设置“平台目标”使其成功。将它设置为x64也有效,但我认为这是一些安全问题。

无论如何,问题解决了!感谢您的所有建议!

答案 2 :(得分:0)

这不是权限问题,但实际上与幕后发生的SysWow64方向有关。 C:\ windows \ system32被隐式重定向到C:\ windows \ syswow64。这就是更改构建体系结构解决问题的原因。适用于任何构建体系结构的替代方法是禁用重定向:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

IntPtr ptr = new IntPtr();
Wow64DisableWow64FsRedirection(ref ptr);

请注意,这是一个每线程设置,因此必须在使用GetFiles()之前在正确的线程中运行。