/// </summary> // Iterates through each file entry within the supplied tar, // extracting them to the nominated folder. /// </summary> public static void ExtractTarByEntry(TarInputStream tarIn, string targetDir) { TarEntry tarEntry; while ((tarEntry = tarIn.GetNextEntry()) != null) { // Converts the unix forward slashes in the filenames to windows backslashes string name = tarEntry.Name.Replace('/', Path.DirectorySeparatorChar); // Remove any root e.g. '\' because a PathRooted filename defeats Path.Combine if (Path.IsPathRooted(name)) { name = name.Substring(System.IO.Path.GetPathRoot(name).Length); } // Apply further name transformations here as necessary string outName = Path.Combine(targetDir, name); string directoryName = Path.GetDirectoryName(outName); try { if (tarEntry.IsDirectory) { Directory.CreateDirectory(outName); continue; } // Does nothing if directory exists Directory.CreateDirectory(directoryName); try { using (var outStr = File.Open(outName, FileMode.Create)) { tarIn.CopyEntryContents(outStr); } // Set the modification date/time. This approach seems to solve timezone issues. DateTime myDt = DateTime.SpecifyKind(tarEntry.ModTime, DateTimeKind.Utc); File.SetLastWriteTime(outName, myDt); } catch (NotSupportedException) { Console.WriteLine($"[!] invalid file name: {outName}"); } catch (PathTooLongException) { Console.WriteLine($"[!] file name too long?! {outName}"); } } catch (NotSupportedException) { Console.WriteLine($"[!] invalid directory name: {directoryName}"); } } }
public override void SetLastWriteTime(string path, DateTime lastWriteTime) { AfsFile.SetLastWriteTime(path, lastWriteTime); }