2013-07-18 250 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

相关问题