Доброго времени суток граждане. Подскажите пожалуйста с pck архивом. два ключа PHP: public static int KEY_1 = -1466731422; public static int KEY_2 = -240896429; упаковка идёт следующим образом PHP: public static void pack(string dir) { string pck = dir.Replace(".arch\\", "").Replace(".arch", "") + "x"; string[] files = Directory.GetFiles(dir, "*", SearchOption.AllDirectories); MessageBox.Show("В каталоге найдено файлов: " + files.Length " , "info", MessageBoxButtons.OK, MessageBoxIcon.Information); for (int a = 0; a < files.Length; ++a) { files[a] = files[a].Replace(dir, "").Replace("/", "\\").Remove(0, 1); } long fileTableOffset = 0; List<fileTableEntry> fileTable = new List<fileTableEntry>(); BinaryWriter bw = new BinaryWriter(new FileStream(pck, FileMode.Create, FileAccess.ReadWrite)); bw.Write(FSIG_1); bw.Write(0); bw.Write(FSIG_2); for (int a = 0; a < files.Length; ++a) { fileTableEntry fte = new fileTableEntry(); MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(dir + "\\" + files[a])); fte.filePath = files[a]; fte.fileDataOffset = (uint)bw.BaseStream.Position; fte.fileDataDecompressedSize = (int)fileMs.Length; MemoryStream ms = new MemoryStream(); CompressStream(fileMs, ms, (int)fileMs.Length); byte[] buffer = ms.ToArray(); fte.fileDataCompressedSize = buffer.Length; bw.Write(buffer); fileTable.Add(fte); string tmp_Y = string.Format(" \rЗаписано файлов: {0}/{1}\r\n", a, files.Length); File.AppendAllText(@"pack.log", DateTime.Now.ToLongDateString()+ " в " + DateTime.Now.ToLongTimeString() + tmp_Y); } fileTableOffset = bw.BaseStream.Position; for (int a = 0; a < fileTable.Count; ++a) { byte[] buffer = writeTableEntry(fileTable[a]); bw.Write(buffer.Length ^ KEY_1); bw.Write(buffer.Length ^ KEY_2); bw.Write(buffer); string tmp_Z = string.Format(" \rЗаписано таблиц файлов: {0}/{1}\r\n", a, fileTable.Count); File.AppendAllText(@"pack.log", DateTime.Now.ToLongDateString() + " в " + DateTime.Now.ToLongTimeString() + tmp_Z); } bw.Write(ASIG_1); bw.Write((short)2); bw.Write((short)2); bw.Write((uint)(fileTableOffset ^ KEY_1)); bw.Write(0); bw.Write(Encoding.Default.GetBytes("Angelica File Package, Perfect World.")); byte[] nuller = new byte[215]; bw.Write(nuller); bw.Write(ASIG_2); bw.Write(fileTable.Count); bw.Write((short)2); bw.Write((short)2); bw.BaseStream.Seek(4, SeekOrigin.Begin); bw.Write((uint)bw.BaseStream.Length); bw.Close(); Split(pck); } Почему при архивировании фалов весом ~2.5Гб говорит о нехватке memory? неужели максимально pck архив 2147483392 байта(как написано в гайде)? ведь максимальное значение 2147483647 - ну допустим ошибка как то можно увеличить лимит? Допустим unsigned _int32 или int64. или ограничено типизацией?
Во-первых, скинь весь код, у тебя есть самописные объекты. Во-вторых, покажи строчку с эксепшеном. В-третьих, дай точное сообщение исключения.
Максимальный размера пака 2ГБ, если размер превышает, то создается кусок *.pkx (склейка с .pck). Предполагаю, что ехе работает с обычным типом int, поэтому не получится просто юзать у себя uint. Посмотри в сторону архива models.pck + pkx
В том то и дело что не создается. Ругается на memory Меня не интересует как работает elementclient.exe. Задача стоит в том, чтобы создавались просто архивы весом более 2ГБ
Я, конечно, ниипу в управление памятью от слова совсем, но Код: for (int a = 0; a < files.Length; ++a) { fileTableEntry fte = new fileTableEntry(); MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(dir + "\\" + files[a])); fte.filePath = files[a]; ... для каждого файла в директории создает поток, в который грузит его содержимое. ГК, поидее, должен его прибить, но мб этого не делает. Лучше снапшоты производительности приложения еще запостить и попробовать: Код: foreach(var file in System.IO.Directory.GetFiles(dir)){ using (MemoryStream fileMs = new MemoryStream(File.ReadAllBytes(file))){ ... } }; Или принудительно диспозить стрим в конце итерации.
для теста взял простой pwpack и попробовал сжать папку в ~30Гб. Без проблем сжал в архив в 15Гб и без проблем распаковал без всяких pkx
Ацкой все верно сказал, что нужно освобождать память. Приучись использовать using и реализовывать интерфейс IDisposable, а то далеко так не уйдешь. Так же используй интерполяцию строк ($"Найдено файлов: {files.Count}"). Так же используй Environment.NewLine, а не "\r\n". Названия классов в C# принято называть в CamelCase, а не lowerCamelCase. Поля класса должны быть закрыты, а св-ва открыты, св-ва всегда называются в CamelCase. Публичные методы тоже CamelCase, приватные lowerCamelCase. Понабираются херни у кнайфов всяких, а потом спрашивают где они сделали ошибку, а ошибка была в том, что ты посмотрел его код.
Лол, читаем весь файл, чтобы сунуть его в поток :/ File.Open юзай и наверни buffer-size какой-нибудь норм, например, 1мб, по скорости будет так же, но не будет течи памяти --- добавлено: 12 сен 2018 в 16:07 --- Черт, это было в июле