我需要将多个文件(视频和音乐和文字)合并为一个文件,其中包含自定义文件类型(例如:*.abcd
)和自定义文件数据结构,该文件只能由我的程序和我的程序应该能够分离这个文件的一部分。 .net
& c#
?
https://www.imageupload.co.uk/image/ZWnh
答案 0 :(得分:3)
正如M463正确指出的那样,您可以使用System.IO.Compression
将这些文件压缩在一起并加密它们......虽然加密是一种完全不同的艺术而另一种令人头疼的问题。
一个更好的选择是在文件的前几个字节中包含一些元数据,然后存储文件'字节作为原始字节。这样可以避免任何人通过在文本编辑器中查看内容来确定内容。同样,如果您想真正保护您的数据,加密是不可避免的。但是一个简单的算法就是:
using System;
using System.IO;
using System.Collections.Generic;
namespace Compression
{
public class ClassName
{
public static void Compress(string[] fileNames, string resultantFileName)
{
List<byte> bytesToWrite = new List<byte>();
//add metadata about the number of files
int filesLength = fileNames.Length;
bytesToWrite.AddRange(BitConverter.GetBytes(filesLength));
List<byte[]> files = new List<byte[]>();
foreach(string fileName in fileNames)
{
byte[] bytes = File.ReadAllBytes(fileName);
//add metadata about the size of each file
bytesToWrite.AddRange(BitConverter.GetBytes(bytes.Length));
files.Add(bytes);
}
foreach(byte[] bytes in files)
{
//write the actual files itself
bytesToWrite.AddRange(bytes);
}
File.WriteAllBytes(resultantFileName, bytesToWrite.ToArray());
}
public static void Decompress(string fileName)
{
List<byte> bytes = new List<byte>(File.ReadAllBytes(fileName));
//this int represents the number of files in the byte array
int filesLength = BitConverter.ToInt32(bytes.ToArray(), 0);
List<int> sizes = new List<int>();
//get the size of each file
for(int i = 0; i < filesLength; i++)
{
//the first 2 bytes represent the number of files
//then each succeding int represents the size of each file
int size = BitConverter.ToInt32(bytes.ToArray(), 2 + i * 2);
sizes.Add(size);
}
//now read all the files
for(int i = 0; i < filesLength; i++)
{
int lastByteTillNow = 0;
for(int j = 0; j < i; j++)
lastByteTillNow += sizes[j];
File.WriteAllBytes("file " + i, bytes.GetRange(2 + 2 * filesLength + lastByteTillNow, sizes[i]).ToArray());
}
}
}
}
现在很明显,这不是您遇到过的最佳算法,也不是最优化的代码片段。毕竟,这正是我在10-15分钟内想出来的。所以我还没有测试过它。但重点是,它给你的想法不是吗?我已将每个文件的大小限制为Int32
的最大长度(但是,将其更改为Int64
a.k.a long
并不会造成太大麻烦。但它给了你一个想法。您甚至可以通过MemoryStreams修改片段以加载和写入RAM(我认为Systtem.IO.MemorySteam
)。但无论如何,这应该会给你一个开始!
答案 1 :(得分:1)
包含文件的加密.zip容器怎么样? .zip文件的处理已在.NET-Framework中提供,请查看library(splitstackshape)
out = cbind(dat, setnames(cSplit(dat, "parm_value", "_", fixed = FALSE),
c("lower_bound", "upper_bound")))
#> out
# parm_value lower_bound upper_bound
#1 30_34 30 34
#2 60_64 60 64
#3 65_69 65 69
#4 75_79 75 79
#5 90_94 90 94
命名空间。或者你可以使用一些第三方库。
如果你真的想要,你甚至可以通过重命名文件来强制使用不同的文件扩展名。