我有一段代码,它将遍历目录位置并从中创建数据模型。例如,如果我有一个目录结构:
c:\TestDir1
c:\TestDir1\Sub1\
c:\TestDir1\Sub1\File1.txt
c:\TestDir1\Sub1\File2.txt
c:\TestDir1\Sub1\SubSub1
c:\TestDir1\Sub1\SubSub1\File3.xlsx
c:\TestDir1\Sub1\SubSub1\SubDirX
c:\TestDir1\Sub1\SubSub1\SubDirX\File4.txt
c:\TestDir1\Sub1\SubSub1\SubDirX\File5.txt
c:\TestDir1\Sub1\SubSub1\SubDirX\File6.txt
它将通过以下代码创建适当的数据模型:
static void BeginIt()
{
DirectoryInfo diTop = new DirectoryInfo(@"c:\Misc\3) Projects\002) Document Manager\DirectoryReading\TestDir1");
string path = diTop.FullName;
MySubDir mySubDir = new MySubDir(path);
}
public class MySubDir
{
public ArrayList _dirs;
public ArrayList _files;
public MySubDir(string dirPath)
{
_dirs = new ArrayList();
_files = new ArrayList();
this.ProcessDirectory(dirPath);
}
private void ProcessDirectory(string dirPath)
{
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(dirPath);
foreach (string fileName in fileEntries)
{
_files.Add(fileName);
}
// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = Directory.GetDirectories(dirPath);
foreach (string subdirectory in subdirectoryEntries)
{
_dirs.Add(new MySubDir(subdirectory));
}
}
}
这是我的问题。当我逐行遍历代码时,它正在适当地构建数据模型。当我执行AddWatch时,我可以看到对象和目录结构已正确构建。
当我尝试通过立即窗口访问内容的值时,我收到错误。例如,如果我在以下窗口中输入以下内容
? mySubDir._dirs [0] ._显示目录[0]
我收到错误。
如何获取这些子目录的值?我希望能够在创建它时访问该模型中元素的目录名和文件名。
由于
答案 0 :(得分:1)
这看起来不会起作用,因为表达式mySubDir.whatever
取决于mySubDir
在范围内并具有有效值。为了实现这一点,构造函数必须首先返回 - 但是在执行构造函数期间正在填充对象。因此,在这个程序的生命周期中,这样的表达式会产生有意义的结果,这一点毫无意义。
如果您在ProcessDirectory
方法内部进入调试器,则可以使用this._dirs
来查看数据结构。
除此之外,ArrayList
不是预先知道的集合的最佳选择,只包含string
s,就像你在这里一样。将这些定义为System.Collections.Generic.List<string>
更合适。
答案 1 :(得分:0)
好.. _dirs和文件是arraylist ..所以你可能希望横向该列表并获取所有值。 a for,enumerator,linq或者你喜欢的任何方法都可以做到这一点..
更新
在阅读了更多帖子之后,我认为存在基本理解的问题。仅向类中添加名称,不会为您提供文件位置或文件夹。您将不得不寻找更好的方式来使用它(也许是一个类文件夹/文件也可以容纳文件夹?)..
答案 2 :(得分:0)
_dirs是一个存储对象的ArrayList,因此您需要将对象从第一个_dir [0]转换为MySubDir
e.g。
((MySubDir)mySubDir._dir[0])._dir[0]
或者将集合类型从ArrayList更改为
List<MySubDir>
当使用索引器访问时,这将为您提供强类型列表项。