我正在尝试访问主文件夹中存在的子文件夹中的所有文件,以及它们的上次访问时间。
我能够获取所有文件,当我尝试获取最后的访问时间时会出现问题。
我收到'对象未设置为对象的实例'异常。
我无法在代码中看到异常。
以下是代码:
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
我也试图获取上述文件的最后访问时间,但异常不允许更进一步。
答案 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() ;
}