2014-06-12 4 views
-2

마지막 액세스 시간과 함께 마스터 폴더 내에있는 하위 폴더 내의 모든 파일에 액세스하려고합니다.FileInfo 클래스에 액세스하는 동안 예외가 발생했습니다.

모든 파일을 가져올 수 있지만 마지막 액세스 시간을 얻으려고 할 때 문제가 발생합니다.

개체 ''예외 인 '개체가 수신됩니다.

내 코드에서 예외를 볼 수 없습니다. 코드는이 시간에 완료되지

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

된다

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; 
     } 

코드는 다음과 같이 호출됩니다 아래

는 코드입니다.

같은 폴더 1 안에 3 개 텍스트 파일이 있습니다

D :

a1.txt \ 홈페이지 \ 폴더 1 \ 빈 \ : \ 홈페이지 \ 폴더 1 \ D

a.txt이가

D : \ 홈페이지 \ 폴더 1 \ SubFolder1 \ 나도 위의 파일의 마지막 액세스 시간을 얻으려고 노력하지만, exce하고

sa1.txt ption은 더 이상 허용하지 않습니다.

+0

미안하지만, 당신은 디버거, 아마도 전체 Visual Studio 지원, 그리고 당신은 예외의 정확한 라인을 모르십니까? – gustavodidomenico

+0

글쎄, 어떤 라인이 예외를 던지고 있으며, 진단을하기 위해 무엇을 했습니까? –

+1

검사에 따르면'fileinfo [i]'는'fileinfo'가 null이기 때문에 실패 할 것입니다 ... 어떻게 작동 할 것이라고 기대 했습니까? –

답변

2

그것은 여기 꽤 명백하다 : 당신이 값을 설정 null 참조에 인덱서를 사용하려고

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 값의 배열을 초기화 할 것이라고 생각하는 것 같다 일부 언어에서는 true이지만 C#에서는 그렇지 않습니다.). 실제로 배열 변수는 자체 인 null 값을 생성합니다. 배열을 초기화하려면 FileInfo[] fileinfo=new FileInfo[size];의 배열을 참조 형식 인 FileInfonull의 기본값 (더 정확하게는 null)의 배열을 만듭니다.

+0

고마워. 알았어. 샐리 .. .. :) – Anurag

0

FileInfo[] fileinfo을 초기화하지 않았습니다.

수정 : FileInfo[] fileInfo = new FileInfo[num]

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() ; 
} 
관련 문제