179

The title says it all:

  1. I read in a tar.gz archive like so
  2. break the file into an array of bytes
  3. Convert those bytes into a Base64 string
  4. Convert that Base64 string back into an array of bytes
  5. Write those bytes back into a new tar.gz file

I can confirm that both files are the same size (the below method returns true), but I can no longer extract the copy version.

Am I missing something?

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);
}

EDIT: The working example is much simpler (Thanks to @T.S.):

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);
}
2
  • You can't just change the the content of a compressed file like that. You'll have to decompress the file in step 1 instead of just read it in directly as is. And then step 5 will likewise have to be recompressing the data instead of just writing out the bytes directly. Commented Sep 18, 2014 at 18:10
  • 1
    Fortunately, as there was no actual manipulation of the file itself (basically just moving it from point A to B) this particular task doesn't require any (de/)compression Commented Sep 18, 2014 at 18:29

1 Answer 1

440

If you want for some reason to convert your file to base-64 string. Like if you want to pass it via internet, etc... you can do this

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

And correspondingly, read back to file:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
Sign up to request clarification or add additional context in comments.

4 Comments

Thankyou for the information, I tried going along with the answer below, but it didnt help, but this seemed to solve my problem with a simple openFileDialog
What if ToBase64String returns System.OutOfMemoryException? How do you optimize for large files and limited memory
@OlorunfemiAjibulu then I suspect, you would need to use streams. Or break string into parts. One time I wrote custom encryption for large files where we saved encrypted chunks. We added 4 bytes to save integer value for chunk size. This way we knew to read so many positions
Interesting @TaylorSpark. I used streams and I was fine.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.