访问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=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() ;
}