diff --git a/Tools/ZipFileDebugger/Program.cs b/Tools/ZipFileDebugger/Program.cs new file mode 100644 index 000000000..035052102 --- /dev/null +++ b/Tools/ZipFileDebugger/Program.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ZipFileDebugger +{ + class MainClass + { + public static void Main(string[] _args) + { + var args = new List(_args); + var opts = Duplicati.Library.Utility.CommandLineParser.ExtractOptions(args, null); + + if (args == null || args.Count == 0) + { + Console.WriteLine("Usage:"); + Console.WriteLine("{0} ", System.Reflection.Assembly.GetEntryAssembly().Location); + return; + } + + Duplicati.Library.Logging.Log.LogLevel = Duplicati.Library.Logging.LogMessageType.Profiling; + Duplicati.Library.Logging.Log.CurrentLog = new Duplicati.Library.Logging.StreamLog(Console.OpenStandardOutput()); + + var filecount = 0; + var errorcount = 0; + foreach (var file in args) + { + if (!File.Exists(file)) + { + Console.WriteLine("File not found: {0}", file); + continue; + } + + if (new FileInfo(file).Length == 0) + { + Console.WriteLine("File is emtpy: {0}", file); + continue; + } + + Console.WriteLine("Opening zip file {0}", file); + + var errors = false; + + try + { + filecount++; + using (var zr = new Duplicati.Library.Compression.FileArchiveZip(file, opts)) + { + var files = zr.ListFilesWithSize(null).ToArray(); + Console.WriteLine("Found {0} files in archive, testing read-ability for each", files.Length); + + for (var i = 0; i < files.Length; i++) + { + Console.Write("Opening file #{0} - {1}", i + 1, files[i].Key); + try + { + using (var ms = new MemoryStream()) + using (var sr = zr.OpenRead(files[i].Key)) + { + sr.CopyTo(ms); + + if (ms.Length == files[i].Value) + Console.WriteLine(" -- success"); + else + Console.WriteLine(" -- bad length: {0} vs {1}", ms.Length, files[i].Value); + } + } + catch (Exception ex) + { + errors = true; + Console.WriteLine(" -- failed: {0}", ex); + } + + } + } + + if (errors) + { + Console.WriteLine("Found errors while processing file {0}", file); + errorcount++; + } + else + Console.WriteLine("Processed file {0} with no errors", file); + } + catch (Exception ex) + { + errorcount++; + Console.WriteLine("Open failed: {0}", ex); + } + } + + Console.Write("Processed {0} zip files", filecount); + if (errorcount == 0) + Console.WriteLine(" without errors"); + else + Console.WriteLine(" and found {0} errors", errorcount); + } + } +} diff --git a/Tools/ZipFileDebugger/Properties/AssemblyInfo.cs b/Tools/ZipFileDebugger/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..581bb7691 --- /dev/null +++ b/Tools/ZipFileDebugger/Properties/AssemblyInfo.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("ZipFileDebugger")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/Tools/ZipFileDebugger/ZipFileDebugger.csproj b/Tools/ZipFileDebugger/ZipFileDebugger.csproj new file mode 100644 index 000000000..8ad515a68 --- /dev/null +++ b/Tools/ZipFileDebugger/ZipFileDebugger.csproj @@ -0,0 +1,51 @@ + + + + Debug + AnyCPU + {669E137C-1DD4-4134-81E8-D94C467392A9} + Exe + ZipFileDebugger + ZipFileDebugger + v4.6.1 + + + true + full + false + bin\Debug + DEBUG; + 4 + + + true + bin\Release + 4 + + + + + + + + + + + {19ECCE09-B5EB-406C-8C57-BAC66997D469} + Duplicati.Library.Compression + + + {C5899F45-B0FF-483C-9D38-24A9FCAAB237} + Duplicati.Library.Interface + + + {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} + Duplicati.Library.Utility + + + {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} + Duplicati.Library.Logging + + + + \ No newline at end of file diff --git a/Tools/ZipFileDebugger/ZipFileDebugger.sln b/Tools/ZipFileDebugger/ZipFileDebugger.sln new file mode 100644 index 000000000..5a51e47a6 --- /dev/null +++ b/Tools/ZipFileDebugger/ZipFileDebugger.sln @@ -0,0 +1,47 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipFileDebugger", "ZipFileDebugger.csproj", "{669E137C-1DD4-4134-81E8-D94C467392A9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Compression", "..\..\Duplicati\Library\Compression\Duplicati.Library.Compression.csproj", "{19ECCE09-B5EB-406C-8C57-BAC66997D469}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Interface", "..\..\Duplicati\Library\Interface\Duplicati.Library.Interface.csproj", "{C5899F45-B0FF-483C-9D38-24A9FCAAB237}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Localization", "..\..\Duplicati\Library\Localization\Duplicati.Library.Localization.csproj", "{B68F2214-951F-4F78-8488-66E1ED3F50BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Logging", "..\..\Duplicati\Library\Logging\Duplicati.Library.Logging.csproj", "{D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Utility", "..\..\Duplicati\Library\Utility\Duplicati.Library.Utility.csproj", "{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {669E137C-1DD4-4134-81E8-D94C467392A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {669E137C-1DD4-4134-81E8-D94C467392A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {669E137C-1DD4-4134-81E8-D94C467392A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {669E137C-1DD4-4134-81E8-D94C467392A9}.Release|Any CPU.Build.0 = Release|Any CPU + {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Release|Any CPU.Build.0 = Release|Any CPU + {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Release|Any CPU.Build.0 = Release|Any CPU + {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Release|Any CPU.Build.0 = Release|Any CPU + {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Release|Any CPU.Build.0 = Release|Any CPU + {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal