2012-02-28 8 views
2

コンテンツフォルダ内のファイルへの相対パスをすべてリストする必要があります。ASP.NET MVCのコンテンツフォルダ内のファイルへのすべてのパスを取得

私は動作するものを書いたが、少し脆いようだ。これを行うにはより良い/賢明な方法がありますか?

var contentPaths = GetRelativePathsToRoot("~/Content/").ToList(); 

private IEnumerable<string> GetRelativePathsToRoot(string virtualPath) 
    { 
     var physicalPath = Server.MapPath(virtualPath); 
     var absolutePaths = Directory.GetFiles(physicalPath, "*.*", SearchOption.AllDirectories);      

     var relativePaths = new List<string>(); 
     foreach (var absolutePath in absolutePaths) 
     {     
      var splittedPath = virtualPath.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);    
      var virtualFolderName = splittedPath[splittedPath.Length -1]; 
      var relativePath = absolutePath 
       .Substring(absolutePath.IndexOf(virtualFolderName)) 
       .Replace("\\", "/");     

      relativePaths.Add(Url.Content("~/" + relativePath)); 
     } 

     return relativePaths; 
    } 

答えて

3

次は短いようだ:

private IEnumerable<string> GetRelativePathsToRoot(string virtualPath) 
{ 
    var physicalPath = Server.MapPath(virtualPath); 
    var absolutePaths = Directory.EnumerateFiles(
     physicalPath, 
     "*.*", 
     SearchOption.AllDirectories 
    ); 
    return absolutePaths.Select(
     x => Url.Content(virtualPath + x.Replace(physicalPath, "")) 
    ); 
} 

はまた、私はDirectory.EnumerateFiles代わりのDirectory.GetFilesを使用していていることに気づきます。このメソッドは.NET 4.0で導入され、string[]の代わりにIEnumreable<string>を返します。これの利点は明らかです。内部的には、このメソッドはFindFirstFileおよびFindNextFile Win32関数を使用します。つまり、実際のファイルシステムの検索は、結果セットの列挙を開始したときにのみ実行されます。

+0

Ow、ありがとう。非常にきれいな。しかし、これは行く方法ですか? – JefClaes

+0

@JefClaes、erm、はい。 –

関連する問題