最近,项目收集了更多的原始遥感图像文件,由于文件大小(每个超过1GB),完全没有硬盘可以完全解压缩,项目只要使用其中的一部分,就会尝试用C#读取其中的一部分。
影像文件组织
百度了一下,以·为后缀的文件是一种压缩文件 ,在Linux和macOS下常见,Linux和macOS都可以直接解压使用这种压缩文件。在windows下的WinRAR也可以使用,相当于常见的RAR和ZIP格式。
而面对大量文件中的部分数据读取,自然想到了程序化解决。
此处用到 ICS库,首先需要添加ICS.dll的引用,本文引用的下载地址为:
程序思路主要是2步,第一步是将解压为tar格式文件,第二部再从tar文件中将指定文件导出,最后删除tar文件完成操作。
解压文件
public bool getTarGzFile(string TargetFile, string saveto, string fileformat)
{
string rootFile = " ";
string filepath = TargetFile;
//读取压缩文件(zip文件),准备解压缩
GZipInputStream gzs = new GZipInputStream()));
string tarfilename = Pa(TargetFile), Pa(TargetFile));
FileStream destFile = File.Open(tarfilename, FileMode.Create);
try
{
int buffersize = 2048;//缓冲区的尺寸,一般是2048的倍数
byte[] FileData = new byte[buffersize];//创建缓冲数据
while (buffersize > 0)//一直读取到文件末尾
{
buffersize = gzs.Read(FileData, 0, buffersize);//读取压缩文件数据
de(FileData, 0, buffersize);//写入目标文件
}
}
catch (Exception ee)
{
Con);
}
de();//关闭目标文件
gzs.Close();//关闭压缩文件
bool result = UnZip(tarfilename, saveto, fileformat);
return result;
}
从tar文件中提取指定文件
在上一步倒数第三行有一个UnZip函数就是提取指定格式文件,提取完成后删除tar文件
private bool UnZip(string fileToUnZip, string zipedFolder, string fileformat)
{
bool result = true;
FileStream fs = null;
TarEntry ent = null;
string fileName;
if (!File.Exists(fileToUnZip))
return false;
if (!Direc(zipedFolder))
Direc(zipedFolder);
try
{
TarInputStream zipStream = new TarInputStream()));
while ((ent = zi()) != null)
{
if (!))
{
fileName = Pa(zipedFolder, ent.Name);
fileName = ('/', '\\');//change by Mr.HopeGi
int index = ent.Name.LastIndexOf('/');
if (index != -1 || ("\\"))
{
string tmpDir = (index != -1 ? (0, ('\\')) : fileName) + "\\";
if (!Direc(tmpDir))
{
Direc(tmpDir);
}
if (tmpDir == fileName)
{
continue;
}
}
List<String> formatlb = (';').ToList();
for (int uu = 0; uu < ; uu++)
{
if (formatlb[uu]))
{
if (fileName))
{
//获取时间
DateTime dt = Da;
string timeNow = dt.ToString("yyyy-MM-dd_HH-mm-ss-ff");
fileName = Sy(fileName) + "\\" + System.IO.Pa(fileName) + "_" + timeNow + Sy(fileName);
}
fs = File.Create(fileName);
int size = 1024 * 1024 * 4;
byte[] data = new byte[size];
while (true)
{
size = zi(data, 0, da);
if (size > 0)
{
(data, 0, size);
}
else
{
break;
}
}
break;
}
}
}
}
zi();
}
catch
{
result = false;
}
finally
{
if (fs != null)
{
();
();
}
if (ent != null)
{
ent = null;
}
GC.Collect();
GC.Collect(1);
}
try
{
File.Delete(fileToUnZip);
}
catch (Exception ex)
{
}
return result;
}
实现效果
程序界面
最终实现压缩文件中指定文件的自动化提取...