Ejemplo n.º 1
0
    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;
            }
        }
    }
Ejemplo n.º 2
0
        public static IFile GetFileInfo(string path)
        {
            var file = new VfsFile(path);
            var info = new FileInfo(path);

            file.Size = info.Length;
            return(file);
        }
Ejemplo n.º 3
0
        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
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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());
        }
Ejemplo n.º 6
0
    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);
        }
    }
Ejemplo n.º 7
0
        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
        }
Ejemplo n.º 8
0
Archivo: vfs.cs Proyecto: sreejukg/ikvm
        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
        }
Ejemplo n.º 9
0
        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);
                }
            }
        }
Ejemplo n.º 10
0
 public abstract Task RemoveFileAsync(VfsFile file, CancellationToken cancel = default);