我使用以下代码列出目录中的文件夹和文件。 在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}}时,它会列出所有文件。
如何解决此问题?
答案 0 :(得分:1)
最有可能的问题是IIS_USRS用户对该文件夹及其内容的权限。 可能的解决方案:
答案 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
,因为无法保证文件名将包含.
个字符。