在IIS中托管时,目录中的文件未列出

时间:2015-12-22 13:11:01

标签: c# asp.net-mvc iis

我使用以下代码列出目录中的文件夹和文件。 在web.config文件中,我添加了:

fileExtensions = ConfigurationManager.AppSettings["DetailUrlFileExtensions"];
if (fileExtensions != string.Empty)
{
    extentions = fileExtensions.Split(',');
}

var items = Directory.GetFileSystemEntries(dirName);
foreach (var item in items)
{
    if (extentions != null)
    {
        string ext = item.Substring(item.LastIndexOf('.'));
        FileAttributes attr = System.IO.File.GetAttributes(item);
        if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
        {
            list.Add(new Node(Path.GetFileName(item), item, Directory.Exists(item), true));
        }
        else if (extentions.Contains(ext))
        {
            list.Add(new Node(Path.GetFileName(item), item, Directory.Exists(item)));
        }
    }
    else
    {
        list.Add(new Node(Path.GetFileName(item), item, Directory.Exists(item)));
    }
}
foreach

但是,在IIS中运行时,它无法运行。该文件夹包含文件夹和文件,在IIS中运行时,文件不会添加到列表中。从具有5个文件夹和11个文件的应用程序以调试模式运行时,foreach块执行14次(而不是16次),但是当从具有相同文件夹和文件的IIS运行时,extentions块仅执行8次,并且没有值添加到列表中。

null为{{1}}时,它会列出所有文件。

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

最有可能的问题是IIS_USRS用户对该文件夹及其内容的权限。 可能的解决方案:

  • 尝试为IIS_USRS用户提供有关该文件夹的完全权限(如果有效,请将其缩小为READ)
  • 在您的Windows用户下运行您的应用程序池
  • 如果安全概念不允许您使用上述两种解决方案,请开发内部可见的服务,该服务可以在高级用户的服务器上运行,然后在您的代码中获取您需要的所有信息,但是通过内部可见的服务

答案 1 :(得分:1)

如果项目不包含.字符,则以下行将失败。

string ext = item.Substring(item.LastIndexOf('.'));

由于您正在处理目录和文件,我怀疑目录可能不包含.个字符。

您可以使用System.IO.Path类安全地操作文件系统路径。具体来说,上面的代码可以替换为:

string ext = Path.GetExtension(item);

如果没有扩展名,GetExtension方法将返回string.Empty,而不是抛出异常。

或者,您可以将文件扩展名的检索移至else块,而不是对目录执行:

FileAttributes attr = System.IO.File.GetAttributes(item);
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
    list.Add(new Node(Path.GetFileName(item), item, Directory.Exists(item), true));
}
else
{
    string ext = item.Substring(item.LastIndexOf('.'));
    if (extentions.Contains(ext)){
        list.Add(new Node(Path.GetFileName(item), item, Directory.Exists(item)));
    }
}

但是,即使在这种情况下,我建议使用System.IO.Path,因为无法保证文件名将包含.个字符。