【发布时间】:2020-09-02 15:05:05
【问题描述】:
我一直在研究一种目录信息查看器。 第一阶段是创建和填充 TreeView 模型,在编码过程中,我嵌套了一种方法来收集有关该目录上文件的信息。 一切正常,返回的值我们是正确的等等。
现在在代码清理阶段,当我尝试从 TreeView 创建中获取该方法时,我得到的值甚至不接近原始值(例如 90 MB 而不是 1.2 TB)。
下面的代码标记了问题:
private static int itemCount = 0;
private static long folderSizeInfo = 0;
public static void ListDirectory(string path)
{
(...)
var rootDirectoryInfo = new DirectoryInfo(path);
MainWindow.newWindowReport.Drzewko.Items.Add(CreateDirectoryNode(rootDirectoryInfo));
//this does not work if invoked from here <----------------- FIX ME!
//DirectoryMainOperation(rootDirectoryInfo);
//need to run this once more to get data from root
DirectoryContent_Operation(rootDirectoryInfo);
(...)
}
private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo)
{
var directoryNode = new TreeViewItem { Header = directoryInfo.Name };
try
{
foreach (var directory in directoryInfo.GetDirectories())
{
if (!IsIgnorable(directory.Name))
{
directoryNode.Items.Add(CreateDirectoryNode(directory));
//this method somehow only works here <------------------------ FIX ME!
DirectoryContent_Operation(directory);
}
}
}
catch (UnauthorizedAccessException)
{
//Console.WriteLine("Path is not accessible: {0}", i);
}
return directoryNode;
}
//-------------------TO BE FIXED------------------
private static void DirectoryMainOperation(DirectoryInfo directoryInfo)
{
try
{
foreach (var directory in directoryInfo.GetDirectories())
{
if (!IsIgnorable(directory.Name))
{
DirectoryContent_Operation(directory);
}
}
}
catch (UnauthorizedAccessException)
{
//Console.WriteLine("Path is not accessible: {0}", i);
}
}
private static void DirectoryContent_Operation(DirectoryInfo targetDir)
{
try
{
foreach (var file in targetDir.EnumerateFiles("*", SearchOption.TopDirectoryOnly))
{
itemCount++;
folderSizeInfo += file.Length;
fileTable.Add(new FileExtension_List
{
FileFormat = file.Extension,
Category = extDB.Translation(file.Extension.ToUpper()),
Count = 1,
TotalSize = file.Length
});
}
}
catch (UnauthorizedAccessException)
{
}
catch (Exception ex)
{
}
}
它的要点是,如果我从以下位置调用“DirectoryContent_Operation(directory)”:
- “CreateDirectoryNode(DirectoryInfo directoryInfo)”它返回 1.2 TB(正确值)
- “DirectoryMainOperation(DirectoryInfo directoryInfo)”返回 90 MB。
【问题讨论】:
-
“如果从这里调用,这将不起作用” - 这是什么意思?是否抛出错误?结果与您的预期有何不同?
-
这些空渔获物是否隐藏了重要信息?请注意,如果抛出异常,所有循环都将被提前终止。
-
“如果从这里调用它不起作用”意味着如果从那里调用它会返回不正确的值。它的要点是,如果我从“CreateDirectoryNode(DirectoryInfo directoryInfo)”运行“DirectoryContent_Operation(directory)”,它会返回 1.2 TB(正确值),如果我从“DirectoryMainOperation(rootDirectoryInfo)”运行它,它会返回 90 MB。
-
正如@JeffE 所指出的,您可能正在吞下导致循环提前退出的异常 - 即。如果根目录包含您无法枚举的文件或文件夹,那么您只会获得文件系统中问题项之前的目录的聚合结果
-
循环部分我能理解,但我不明白为什么它嵌套在方法 A 中而在方法 B 中不起作用——它们的构建方式相同(ctrl+c、ctrl+v )。它们具有相同的循环结构,具有相同的 try/catch 异常。
标签: c# wpf directoryinfo