-2

我正在尝试访问主文件夹中存在的子文件夹中的所有文件,以及它们的最后访问时间。

我能够获取所有文件,当我尝试获取最后访问时间时会出现问题。

我收到“对象未设置为对象的实例”异常。

我无法在我的代码中看到异常。

下面是代码:

public List<String> GetDirs(string Dir)
        {
            List<String> files = new List<String>();
            try
            {
                foreach (string f in Directory.GetFiles(Dir))
                {
                    files.Add(f);
                }
                foreach (string d in Directory.GetDirectories(Dir))
                {
                    files.AddRange(GetDirs(d));
                }
                int num=files.Count;
                FileInfo[] fileinfo=null;
                for (int i = 0; i < num; i++)
                {
                    fileinfo[i] = new FileInfo(files[i]);//Exception at this line of code

                }
                foreach(FileInfo xx in fileinfo)
                {
                    Response.Write(xx.LastWriteTime);
                }
              }
            catch (System.Exception excpt)
            {
                Response.Write(excpt.Message);
            }

            return files;
        }

代码被称为:

    string fullPath = @"D:\Main\Folder1";
    List<string> lst=GetDirs(fullPath);

代码暂时不完整。

Folder1里面有3个文本文件,比如:

D:\Main\Folder1\a.txt

D:\Main\Folder1\bin\a1.txt

D:\Main\Folder1\SubFolder1\sa1.txt

我也在尝试获取上述文件的最后访问时间,但例外情况不允许更进一步。

4

3 回答 3

2

这里很明显:

FileInfo[] fileinfo=null;   // <-- fileinfo is null
for (int i = 0; i < num; i++)
{
    fileinfo[i] = new FileInfo(files[i]);//Exception at this line of code
//   ^--- fileinfo is still null!
}

您正在尝试在空引用上使用索引器来设置值。我想你想要:

FileInfo[] fileinfo= new FileInfo[num];
for (int i = 0; i < num; i++)
{
    fileinfo[i] = new FileInfo(files[i]);//Exception at this line of code
}

要不就

FileInfo[] fileinfo = files.Select(f => new FileInfo(f)).ToArray();

编辑

阅读您的评论后,您似乎认为这FileInfo[] fileinfo=null;将初始化一个空值数组(在某些语言中是这样,但在 C# 中不是这样)。实际上,它创建了一个本身为空值的数组变量。要初始化一个数组,您可以使用FileInfo[] fileinfo=new FileInfo[size];创建一个空值数组的语法(更准确地说,是 的默认值,因为它是一个引用类型)。FileInfonull

于 2014-06-12T17:46:37.150 回答
0

您没有初始化 FileInfo[] fileinfo.

使固定: FileInfo[] fileInfo = new FileInfo[num]

于 2014-06-12T17:46:36.647 回答
0

您的代码似乎...有点复杂...对于它的作用。让框架为您完成工作并说这样的话会不会容易得多:

public static IEnumerable<FileSystemInfo> ContentsOfDirectoryTreeRootedAt( string rootDirectory )
{
  DirectoryInfo root = new DirectoryInfo( rootDirectory ) ;
  if ( !root.Exists ) throw new DirectoryNotFoundException(rootDirectory) ;

  foreach( FileSystemInfo entry in root.EnumerateFileSystemInfos(null,SearchOption.AllDirectories) )
  {
    yield return entry ;
  }

}

然后您可以按照以下方式调用它:

foreach( FileInfo fi in ContentsOfDirectoryTreeRootedAt( @"C:\foo\bar" ).Where( x => x is FileInfo ).Cast<FileInfo>() )
{
  Console.Write( "FileName: {0}" , fi.FullName ) ;
  Console.Write( "\t" );
  Console.Write( "Last Updated: {1}" , fi.LastWriteTime ) ;
  Console.Write( "\t" );
  Console.Write( "Size: {0:0.0}kb" , (decimal)fi.Length / 1024m ) ;
  Console.WriteLine() ;
}
于 2014-06-12T19:51:15.190 回答