public void WriteJson(DatFileManager fileManager, int len)
        {
            var json = ToString();

            fileManager?.WriteToEnd(Encoding.UTF8.GetBytes(json), len);
            IsChenged = false;
        }
        public void Dispose()
        {
            Save();
            fManager?.Dispose();

            fManager             = null;
            jsonStructureManager = null;
        }
        protected AbstractJsonResourceManager(string filePath, bool newFile = false, bool isCheckHash = true)
        {
            if (newFile)
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }

            fManager = new DatFileManager(filePath)
            {
                IsShiftJsonPosition = true
            };
            var json = newFile ? string.Empty : Encoding.UTF8.GetString(fManager.GetBytesFromEnd(JSON_LEN));

            jsonStructureManager = new JsonStructureManager(json, isCheckHash);
            fManager.IsCheckHash = jsonStructureManager.IsCheckHash;
            FilePath             = filePath;
        }
        public void DataVacuum()
        {
            DatFileManager makeDatFileManager(string f) => new DatFileManager(f)
            {
                IsCheckHash = fManager.IsCheckHash
            };

            var tempFilePath = "{0}_temp".FormatString(this.fManager.FilePath);

            using (var tempfManager = makeDatFileManager(tempFilePath))
            {
                jsonStructureManager.Vacuum(fManager, tempfManager, LEN, (completedNumber, fullNumber, currentFilePath) =>
                {
                    VacuumProgress?.Invoke(this, new ReadWriteProgressEventArgs(completedNumber, fullNumber, currentFilePath, true));
                });
            }

            var filePath = fManager.FilePath;

            fManager = fManager.Rename("_temp");
        }
        public void Vacuum(DatFileManager srcfileManager, DatFileManager destfileManager, int identifierLength, Action <int, int, string> action)
        {
            var files = GetFileStructures();

            foreach (var dataFileInfo in files.Select((v, i) => new { v, i }))
            {
                var id   = dataFileInfo.v.Id;
                var loc  = dataFileInfo.v.Location;
                var nloc = srcfileManager.WriteToTemp(loc, destfileManager, identifierLength);

                ChangeFile(id, new FileStructure
                {
                    Id         = dataFileInfo.v.Id,
                    Parent     = dataFileInfo.v.Parent,
                    Name       = dataFileInfo.v.Name,
                    Location   = nloc,
                    Additional = dataFileInfo.v.Additional,
                    Hash       = dataFileInfo.v.Hash
                });
                action?.Invoke(dataFileInfo.i + 1, files.Length, dataFileInfo.v.Name);
            }
            IsChenged = true;
        }