访问FileInfo类时发生异常

本文关键字:异常 FileInfo 访问 | 更新日期: 2023-09-27 18:08:34

我试图访问子文件夹内的所有文件,这些文件存在于主文件夹内,以及它们的最后访问时间。

我可以得到所有的文件,但是当我试图得到最后一次访问时间时,问题出现了。

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

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

代码如下:

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: ' ' Folder1 ' a.txt

主要

D: ' ' Folder1 ' bin ' a1.txt

主要

D: ' ' Folder1 ' SubFolder1 ' sa1.txt

我也试图获得上述文件的最后访问时间,但异常不允许进一步。

访问FileInfo类时发生异常

这里很明显:

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;将初始化一个null值数组(这在某些语言中是正确的,但不是c#)。实际上,它创建的数组变量本身为空值。要初始化一个数组,可以使用语法FileInfo[] fileinfo=new FileInfo[size];,其中创建一个空值数组(更准确地说,是FileInfo的默认值,因为它是一个引用类型,所以是null)。

您没有初始化FileInfo[] fileinfo

修复:FileInfo[] fileInfo = new FileInfo[num]

您的代码似乎…有点复杂……因为它的作用。如果让框架为您做这些工作,并像这样说:

,不是更容易吗?
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() ;
}