diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveDataFormat.cs
index b4504bb5..8d40a00b 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveDataFormat.cs
+++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveDataFormat.cs
@@ -47,17 +47,17 @@ namespace UniversalEditor.DataFormats.FileSystem.TapeArchive
string fileName = br.ReadFixedLengthString(100).TrimNull().Trim();
if (fileName == String.Empty) break;
- string fileMode = br.ReadFixedLengthString(8).TrimNull().Trim();
- string owner = br.ReadFixedLengthString(8).TrimNull().Trim();
- string group = br.ReadFixedLengthString(8).TrimNull().Trim();
- string fileSizeInBytesOctal = br.ReadFixedLengthString(12).TrimNull().Trim();
- string lastModificationTimeUnixOctal = br.ReadFixedLengthString(12).TrimNull().Trim();
- string headerChecksum = br.ReadFixedLengthString(8).TrimNull().Trim();
+ string fileMode = br.ReadPaddedNullTerminatedString(8);
+ string owner = br.ReadPaddedNullTerminatedString(8);
+ string group = br.ReadPaddedNullTerminatedString(8);
+ string fileSizeInBytesOctal = br.ReadPaddedNullTerminatedString(12);
+ string lastModificationTimeUnixOctal = br.ReadPaddedNullTerminatedString(12);
+ string headerChecksum = br.ReadPaddedNullTerminatedString(8);
char c = br.ReadChar();
TapeArchiveRecordType type = (TapeArchiveRecordType)((int)c);
- string linkedFileName = br.ReadFixedLengthString(100).TrimNull().Trim();
+ string linkedFileName = br.ReadPaddedNullTerminatedString(100);
string ustar = br.ReadFixedLengthString(6);
if (ustar == "ustar ")
@@ -67,12 +67,12 @@ namespace UniversalEditor.DataFormats.FileSystem.TapeArchive
mvarIsUnixStandardTAR = true;
ustar_set = true;
}
- string ustarVersion = br.ReadFixedLengthString(2).TrimNull().Trim();
- string ownerName = br.ReadFixedLengthString(32).TrimNull().Trim();
- string groupName = br.ReadFixedLengthString(32).TrimNull().Trim();
- string deviceMajor = br.ReadFixedLengthString(8).TrimNull().Trim();
- string deviceMinor = br.ReadFixedLengthString(8).TrimNull().Trim();
- string filenamePrefix = br.ReadFixedLengthString(155).TrimNull().Trim();
+ string ustarVersion = br.ReadPaddedNullTerminatedString(2);
+ string ownerName = br.ReadPaddedNullTerminatedString(32);
+ string groupName = br.ReadPaddedNullTerminatedString(32);
+ string deviceMajor = br.ReadPaddedNullTerminatedString(8);
+ string deviceMinor = br.ReadPaddedNullTerminatedString(8);
+ string filenamePrefix = br.ReadPaddedNullTerminatedString(155);
}
else
{
@@ -149,18 +149,22 @@ namespace UniversalEditor.DataFormats.FileSystem.TapeArchive
{
bw.WriteFixedLengthString(folder.Name + "/", 100);
- string fileMode = " \0";
- bw.WriteFixedLengthString(fileMode, 8);
- string owner = " \0";
- bw.WriteFixedLengthString(owner, 8);
- string group = " \0";
- bw.WriteFixedLengthString(group, 8);
- string fileSizeInBytesOctal = " \0";
- bw.WriteFixedLengthString(fileSizeInBytesOctal, 12);
- string lastModificationTimeUnixOctal = " \0";
- bw.WriteFixedLengthString(lastModificationTimeUnixOctal, 12);
- string headerChecksum = " \0";
- bw.WriteFixedLengthString(headerChecksum, 12);
+ long? fileMode = null;
+ bw.WritePaddedNullableInt64(fileMode, 8);
+ long? owner = null;
+ bw.WritePaddedNullableInt64(owner, 8);
+ long? group = null;
+ bw.WritePaddedNullableInt64(group, 8);
+
+ long fileSizeInBytesDecimal = folder.GetSize();
+ long? fileSizeInBytesOctal = null;
+ bw.WritePaddedNullableInt64(fileSizeInBytesOctal, 8);
+
+ long? lastModificationTimeUnixOctal = null;
+ bw.WritePaddedNullableInt64(lastModificationTimeUnixOctal, 12);
+
+ long? headerChecksum = null;
+ bw.WritePaddedNullableInt64(headerChecksum, 12);
char c = (char)(int)TapeArchiveRecordType.Directory;
@@ -202,18 +206,18 @@ namespace UniversalEditor.DataFormats.FileSystem.TapeArchive
bw.WriteFixedLengthString(parentPath, 100);
- string fileMode = " \0";
- bw.WriteFixedLengthString(fileMode, 8);
- string owner = " \0";
- bw.WriteFixedLengthString(owner, 8);
- string group = " \0";
- bw.WriteFixedLengthString(group, 8);
+ long? fileMode = null;
+ bw.WritePaddedNullableInt64(fileMode, 8);
+ long? owner = null;
+ bw.WritePaddedNullableInt64(owner, 8);
+ long? group = null;
+ bw.WritePaddedNullableInt64(group, 8);
string fileSizeInBytesOctal = Convert.ToString(file.Size, 8).PadLeft(11, ' ') + "\0";
bw.WriteFixedLengthString(fileSizeInBytesOctal, 12);
- string lastModificationTimeUnixOctal = " \0";
+ string lastModificationTimeUnixOctal = String.Empty;
bw.WriteFixedLengthString(lastModificationTimeUnixOctal, 12);
- string headerChecksum = " \0";
- bw.WriteFixedLengthString(headerChecksum, 12);
+ long? headerChecksum = null;
+ bw.WritePaddedNullableInt64(headerChecksum, 12);
char c = (char)(int)TapeArchiveRecordType.Directory;
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveExtensions.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveExtensions.cs
new file mode 100644
index 00000000..bbd1f59c
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/TapeArchive/TapeArchiveExtensions.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UniversalEditor.IO;
+
+namespace UniversalEditor.DataFormats.FileSystem.TapeArchive
+{
+ public static class TapeArchiveExtensions
+ {
+ public static string ReadPaddedNullTerminatedString(this Reader reader, int length)
+ {
+ return reader.ReadFixedLengthString(length).TrimNull().Trim();
+ }
+ public static void WritePaddedNullTerminatedString(this Writer writer, string value, int length)
+ {
+ writer.WriteFixedLengthString(value, length - 1, ' ');
+ writer.WriteFixedLengthString("\0");
+ }
+ public static void WritePaddedNullableInt64(this Writer writer, long? value, int length)
+ {
+ writer.WritePaddedNullTerminatedString((value == null ? String.Empty : value.Value.ToString()), length);
+ }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
index 798c443a..84c615b5 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
+++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
@@ -157,6 +157,7 @@
+