Esempio n. 1
0
        void RestoreBackup(string destPath, string backup)
        {
            if (File.Exists(destPath) && File.Exists(backup))
            {
                File.Delete(destPath);

                if (backup != null)
                {
                    File.Move(backup, destPath);

                    if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase))
                    {
                        for (int i = 0; i < Subfiles.Count; i++)
                        {
                            ppSubfile subfile = Subfiles[i] as ppSubfile;

                            /*if ((subfile != null) && subfile.ppPath.Equals(backup, StringComparison.InvariantCultureIgnoreCase))
                             * {
                             *      subfile.ppPath = this.FilePath;
                             * }*/
                        }
                    }
                }
            }
        }
Esempio n. 2
0
		public static List<IWriteFile> ReadHeader(FileStream stream)
		{
			stream.Position = 0;
			BinaryReader reader = new BinaryReader(stream);

			byte[] versionHeader = reader.ReadBytes(8);

			reader.ReadBytes(4);
			//Version = BitConverter.ToInt32(DecryptHeaderBytes(reader.ReadBytes(4)), 0);

			TransformHeaderBytes(reader.ReadBytes(1));  // first byte
			int numFiles = BitConverter.ToInt32(TransformHeaderBytes(reader.ReadBytes(4)), 0);
			byte[] buf = TransformHeaderBytes(reader.ReadBytes(numFiles * 288));

			var subfiles = new List<IWriteFile>(numFiles);
			for (int i = 0; i < numFiles; i++)
			{
				int offset = i * 288;
				ppSubfile subfile = new ppSubfile(stream.Name);
				int length = 260;
				for (int j = 0; j < length; j++)
				{
					if (buf[offset + j] == 0x00)
					{
						length = j;
						break;
					}
				}
				subfile.Name = Utility.EncodingShiftJIS.GetString(buf, offset, length);
				subfile.size = BitConverter.ToUInt32(buf, offset + 260);
				subfile.offset = BitConverter.ToUInt32(buf, offset + 264);

				Metadata metadata = new Metadata();
				metadata.LastBytes = new byte[20];
				System.Array.Copy(buf, offset + 268, metadata.LastBytes, 0, 20);
				subfile.Metadata = metadata;

				subfiles.Add(subfile);
			}

			return subfiles;
		}
Esempio n. 3
0
        void writeArchiveWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = (BackgroundWorker)sender;
            string           backup = null;

            string dirName = Path.GetDirectoryName(destPath);

            if (dirName == String.Empty)
            {
                dirName = @".\";
            }
            DirectoryInfo dir = new DirectoryInfo(dirName);

            if (!dir.Exists)
            {
                dir.Create();
            }

            if (File.Exists(destPath))
            {
                backup = Utility.GetDestFile(dir, Path.GetFileNameWithoutExtension(destPath) + ".bak", backupExt);
                File.Move(destPath, backup);

                if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase))
                {
                    for (int i = 0; i < Subfiles.Count; i++)
                    {
                        ppSubfile subfile = Subfiles[i] as ppSubfile;

                        /*if ((subfile != null) && subfile.ppPath.Equals(this.FilePath, StringComparison.InvariantCultureIgnoreCase))
                         * {
                         *      subfile.ppPath = backup;
                         * }*/
                    }
                }
            }

            try
            {
                using (BinaryWriter writer = new BinaryWriter(File.Create(destPath)))
                {
                    writer.BaseStream.Seek(ppHeader_Wakeari.HeaderSize(Subfiles.Count), SeekOrigin.Begin);
                    uint     offset   = (uint)writer.BaseStream.Position;
                    uint[]   sizes    = new uint[Subfiles.Count];
                    object[] metadata = new object[Subfiles.Count];

                    using (BinaryReader reader = new BinaryReader(File.OpenRead(backup != null ? backup : FilePath)))
                    {
                        for (int i = 0; i < Subfiles.Count; i++)
                        {
                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                break;
                            }

                            worker.ReportProgress(i * 100 / Subfiles.Count);

                            if (Subfiles[i] is ppSubfile subfile)
                            {
                                reader.BaseStream.Seek(subfile.offset, SeekOrigin.Begin);

                                uint readSteps = (uint)(subfile.size / (double)Utility.BufSize);
                                for (int j = 0; j < readSteps; j++)
                                {
                                    writer.Write(reader.ReadBytes(Utility.BufSize));
                                }
                                writer.Write(reader.ReadBytes((int)(subfile.size % Utility.BufSize)));

                                metadata[i] = subfile.Metadata;
                            }
                            else
                            {
                                Stream stream = ppFormat_AA2.WriteStream(writer.BaseStream);
                                Subfiles[i].WriteTo(stream);
                                metadata[i] = ppFormat_AA2.FinishWriteTo(stream);
                            }

                            uint pos = (uint)writer.BaseStream.Position;
                            sizes[i] = pos - offset;
                            offset   = pos;
                        }
                    }

                    if (!e.Cancel)
                    {
                        writer.BaseStream.Seek(0, SeekOrigin.Begin);
                        ppHeader_Wakeari.WriteHeader(writer.BaseStream, Subfiles, sizes, metadata);
                        offset = (uint)writer.BaseStream.Position;
                        for (int i = 0; i < Subfiles.Count; i++)
                        {
                            if (Subfiles[i] is ppSubfile subfile)
                            {
                                subfile.offset = offset;
                                subfile.size   = sizes[i];
                            }
                            offset += sizes[i];
                        }
                    }
                }

                if (e.Cancel)
                {
                    RestoreBackup(destPath, backup);
                }
                else
                {
                    if (destPath.Equals(FilePath, StringComparison.InvariantCultureIgnoreCase))
                    {
                        for (int i = 0; i < Subfiles.Count; i++)
                        {
                            ppSubfile subfile = Subfiles[i] as ppSubfile;

                            /*if ((subfile != null) && subfile.ppPath.Equals(backup, StringComparison.InvariantCultureIgnoreCase))
                             * {
                             *      subfile.ppPath = this.FilePath;
                             * }*/
                        }
                    }
                    else
                    {
                        FilePath = destPath;
                    }

                    if ((backup != null) && !keepBackup)
                    {
                        File.Delete(backup);
                    }
                }
            }
            catch
            {
                RestoreBackup(destPath, backup);
            }
        }