public override async Task AddFileAsync(VfsFile file, CancellationToken cancel = default) { using (await AsyncLock.LockWithAwait(cancel)) { int r = file.AddLinkRef(); try { if (file.FileSystem != this.FileSystem) { throw new VfsException(file.Name, "file.FileSystem != this.FileSystem"); } FileSystem.PathParser.ValidateFileOrDirectoryName(file.Name); if (EntityTable.ContainsKey(file.Name)) { throw new VfsException(file.Name, "The same name already exists."); } EntityTable.Add(file.Name, file); } catch { await file.ReleaseLinkAsync(); throw; } } }
public static IFile GetFileInfo(string path) { var file = new VfsFile(path); var info = new FileInfo(path); file.Size = info.Length; return(file); }
internal static long GetLength(string path) { #if FIRST_PASS return(0); #else VfsFile entry = GetVfsEntry(path) as VfsFile; return(entry == null ? 0 : entry.Size); #endif }
private static void EvaluateFileExtension(VfsFile file, Evaluator evaluator) { var extension = Path.GetExtension(file.FullPath); foreach (var type in FileTypeDatabase.GetFileTypesByExtension(extension)) { evaluator.Add(type, POINTS_EXTENSION); } }
public static FileTypeMatch[] DetermineFileType(VfsFile file) { var evaluator = new Evaluator(); var fileStream = new CachedReadStream(file.GetStream()); EvaluateContentSignatures(fileStream, evaluator); EvaluateMagicSignatures(fileStream, evaluator); EvaluateFileExtension(file, evaluator); return(evaluator.FinalizeMatches()); }
public override async Task RemoveFileAsync(VfsFile file, CancellationToken cancel = default) { using (await AsyncLock.LockWithAwait(cancel)) { if (EntityTable.ContainsValue(file) == false) { throw new VfsException(file.Name, $"The object is not contained on the parent directory \"{this.Name}\"."); } await file.ReleaseLinkAsync(); EntityTable.Remove(file.Name); } }
internal static System.IO.Stream Open(string name, System.IO.FileMode fileMode, System.IO.FileAccess fileAccess) { #if FIRST_PASS return(null); #else if (fileMode != System.IO.FileMode.Open || fileAccess != System.IO.FileAccess.Read) { throw new System.IO.IOException("vfs is read-only"); } VfsFile entry = GetVfsEntry(name) as VfsFile; if (entry == null) { throw new System.IO.FileNotFoundException("File not found"); } return(entry.Open()); #endif }
internal static System.IO.Stream Open(string name, System.IO.FileMode fileMode, System.IO.FileAccess fileAccess) { #if FIRST_PASS return(null); #else if (fileMode != System.IO.FileMode.Open || fileAccess != System.IO.FileAccess.Read) { throw new System.IO.IOException("vfs is read-only"); } VfsFile entry = GetVfsEntry(name) as VfsFile; if (entry == null) { throw new System.IO.FileNotFoundException("File not found"); } //Console.Error.WriteLine($"Returning {name} which is of type {entry.GetType().FullName}"); return(entry.Open()); #endif }
private void Scan(VfsFile file, int level = 1) { SetStatus(file.FullPath); var typeMatches = FileScanner.DetermineFileType(file.GetStream()); if (typeMatches.Length == 0) { return; } var fileType = typeMatches[0].FileType; Console.WriteLine("{0}- {1}: {2}", new string( ' ', level * 2 ), file.FullPath, fileType.Name); if (fileType.Category == FileCategory.Archive && VfsDeviceFactory.TryGetDevice(fileType, file.GetStream(), out var device)) { try { device.Initialize(); foreach (var childFile in device.EnumerateFiles(true)) { Scan(childFile, level + 1); } } catch (Exception ex) { Console.WriteLine("{0}- Failed to read from the archive: {1}", new string( ' ', (level + 1) * 2 ), ex.Message); } } else if (fileType == FileType.ELF) { var symbols = ElfDebugSymbolScanner.GetDebugSymbolCount(file.GetStream()); if (symbols > 2) { Console.WriteLine("{0}- {1} Debug Symbols Found", new string( ' ', (level + 1) * 2 ), symbols); } } }
public abstract Task RemoveFileAsync(VfsFile file, CancellationToken cancel = default);