访问FileInfo类时出现异常

时间:2014-06-12 17:42:28

标签: c# file-io system.io.fileinfo

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

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

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

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

以下是代码:

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

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

3 个答案:

答案 0 :(得分: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];创建一个空值数组(更确切地说,是FileInfo的默认值,即{{1}因为它是一个引用类型)。

答案 1 :(得分:0)

您尚未初始化FileInfo[] fileinfo

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

答案 2 :(得分: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() ;
}