将文件转换为Base64String然后再次返回


108

标题说明了一切:

  1. 我像这样读tar.gz档案
  2. 将文件分成字节数组
  3. 将这些字节转换为Base64字符串
  4. 将该Base64字符串转换回字节数组
  5. 将那些字节写回到新的tar.gz文件中

我可以确认两个文件的大小相同(以下方法返回true),但是我无法再提取副本版本。

我想念什么吗?

Boolean MyMethod(){
    using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
        String AsString = sr.ReadToEnd();
        byte[] AsBytes = new byte[AsString.Length];
        Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
        String AsBase64String = Convert.ToBase64String(AsBytes);

        byte[] tempBytes = Convert.FromBase64String(AsBase64String);
        File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
    }
    FileInfo orig = new FileInfo("C:\...\file.tar.gz");
    FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

编辑:工作示例要简单得多(感谢@TS):

Boolean MyMethod(){
    byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
    String AsBase64String = Convert.ToBase64String(AsBytes);

    byte[] tempBytes = Convert.FromBase64String(AsBase64String);
    File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);

    FileInfo orig = new FileInfo(@"C:\...\file.tar.gz");
    FileInfo copy = new FileInfo(@"C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

谢谢!


您不能只这样更改压缩文件的内容。您必须在步骤1中解压缩文件,而不是直接按原样读取文件。然后,第5步同样必须重新压缩数据,而不是直接写出字节。
itsme86

幸运的是,由于没有文件本身的实际操作(基本上只是将文件从A点移动到B点),此特定任务不需要任何(de /)压缩
darkpbj 2014年

Answers:


289

如果出于某种原因想要将文件转换为base-64字符串。就像您想通过互联网等通过它一样...

Byte[] bytes = File.ReadAllBytes("path");
String file = Convert.ToBase64String(bytes);

并相应地,读回文件:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

谢谢您提供的信息,我尝试使用下面的答案,但这没有帮助,但这似乎可以通过一个简单的openFileDialog解决我的问题
SirCode先生19年

如果ToBase64String返回System.OutOfMemoryException怎么办?您如何针对大文件和有限的内存进行优化
Olorunfemi Ajibulu

@OlorunfemiAjibulu然后我怀疑,您将需要使用流。或将字符串分成几部分。有一次,我为大型文件编写了自定义加密,在其中保存了加密块。我们添加了4个字节来保存块大小的整数值。这样我们就知道要阅读很多职位
TS

有趣的@TaylorSpark。我使用流,并且很好。
Olorunfemi Ajibulu

3
private String encodeFileToBase64Binary(File file){    
String encodedfile = null;  
try {  
    FileInputStream fileInputStreamReader = new FileInputStream(file);  
    byte[] bytes = new byte[(int)file.length()];
    fileInputStreamReader.read(bytes);  
    encodedfile = Base64.encodeBase64(bytes).toString();  
} catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
} catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}  
    return encodedfile;  
}

3
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。请阅读此操作指南以提供优质的答案。
thewaywere是

1
同样,为什么要java使用OP c#呢?
TS TS

@TS为什么又需要Java?
单击确定
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.