2013-07-18 248 views
3

在我的應用程序中,我有很多保存在特定路徑結構中的小文件。我正在創建一個容器文件,我希望以包含每個文件或文件大小的偏移等信息的標題開始存儲所有現有文件。我正在用BinaryWriter寫這個文件。但是有很多重複項只添加到我的容器文件中一次。因此,我爲每個文件創建一個散列值,並將其與數據表中的現有散列值進行比較。這個工作就像它應該那樣,但是我想知道這是否是好的做法,因爲可能有大量的數據。有更好或更高效的方法來實現我的目標嗎?c#在運行時存儲大量數據的最佳方式

這裏是我的實際代碼:

// I parsed through my files and created my header 
// all file paths were added to my tileList 
DataTable dtImageInfos = new DataTable(); 
dtImageInfos.Columns.Add("tilename", typeof(String)); 
dtImageInfos.Columns.Add("hash", typeof(String)); 
dtImageInfos.Columns.Add("offset", typeof(long)); 

foreach (String tile in tileList) 
{        
    FileInfo f = new FileInfo(tile); 
    int tileSize = Convert.ToInt32(f.Length); 

    if (tileSize <= MAX_CHECK_SIZE) 
    { 
     Image tileImg = Image.FromFile(tile); 
     String tileHash = createHashForImage(tileImg); 
     DataTable dtCheck = dtImageInfos.Clone();         

     if (dtImageInfos.Rows.Count > 0) 
      dtImageInfos.AsEnumerable().Where(t => t.Field<String>("hash").Equals(tileHash)) 
          .CopyToDataTable(dtCheck, LoadOption.OverwriteChanges);c#         

     if (dtCheck.Rows.Count == 0) 
     { 
      writer.Write(tileOffset); 

      DataRow drNew = dtImageInfos.NewRow(); 
      drNew["tilename"] = tile; 
      drNew["hash"] = tileHash; 
      drNew["offset"] = tileOffset; 
      dtImageInfos.Rows.Add(drNew); 

      tileOffset += tileSize; 
     } 
     else 
     { 
      DataRow drCheck = dtCheck.Rows[0]; 
      writer.Write((long)drCheck["offset"]); 
     }    
    } 
    else 
    { 
     writer.Write(tileOffset); 

     DataRow drNew = dtImageInfos.NewRow(); 
     drNew["tilename"] = tile; 
     drNew["hash"] = ""; 
     drNew["offset"] = tileOffset; 
     dtImageInfos.Rows.Add(drNew); 

     tileOffset += tileSize; 
    } 
    writer.Write(tileSize);        
} 

foreach (DataRow drTile in dtImageInfos.Rows) 
{ 
    byte[] tileData = File.ReadAllBytes(drTile["tilename"].ToString()); 
    writer.Write(tileData); 
} 

我希望我可以讓我的問題可以理解的。在此先感謝

+0

你解釋你做了什麼,不知道你爲什麼這樣做沒有適當的方法來回答這個問題。它的執行速度對你來說足夠嗎?你遇到與性能相關的問題嗎?我懷疑許多人喜歡閱讀其他人未註釋的代碼。 – Samuel

+0

用於存儲大量持久數據的設備稱爲**數據庫**。使用數據庫。 –

+0

OP正試圖創建自己的歸檔文件格式,.NET 4.5具有ZipFile和ZipArchive,只需要幾行代碼就可以歸檔/壓縮和檢索文件目錄(磁貼圖像)。 –

回答

0

使用最新版本的C#.NET,您可以避免只是使用Zip文件的頭頂上。

System.IO.Compression.ZipFile.CreateFromDirectory(folderPathWithTiles, containerPath); 

您可以在zip存檔(容器文件)與.OpenRead方法訪問不同的文件(磚)。

using (ZipArchive tiles = ZipFile.OpenRead(containerPath)) 
{ 
    ZipArchiveEntry tile = tiles.GetEntry(relativeTilePath); 
    Image tileImage = Image.FromStream(tile.Open()); 
} 

的ZipFile: http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile.aspx

ZipArchive: http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive.aspx

ZipArchiveEntry: http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry.aspx

相關問題