コード例 #1
0
ファイル: IMGArchive.cs プロジェクト: BigETI/IMGSharp
        /// <summary>
        /// Create IMG archive entry
        /// </summary>
        /// <param name="entryName">Entry name</param>
        /// <returns>IMG archive entry if successful, otherwise "null"</returns>
        public IIMGArchiveEntry CreateEntry(string entryName)
        {
            if (entryName == null)
            {
                throw new ArgumentNullException(nameof(entryName));
            }
            IIMGArchiveEntry ret        = null;
            string           entry_name = entryName.Trim();
            bool             proceed    = true;

            Parallel.ForEach(Path.GetInvalidPathChars(), (invalid_path_character, parallelLoopState) =>
            {
                if (entry_name.Contains(invalid_path_character.ToString()))
                {
                    proceed = false;
                    parallelLoopState.Break();
                }
            });
            if (proceed)
            {
                string key = entry_name.ToLower();
                if (!InternalEntries.ContainsKey(key))
                {
                    InternalEntries.Add(key, new IMGArchiveEntry(this, Stream.Length, 0, entry_name, true));
                }
            }
            return(ret);
        }
コード例 #2
0
 public void CommitToIMGFile()
 {
     InitializeIMGArchives();
     if (File.Exists(testDotThreeDotIMGFilePath))
     {
         File.Delete(testDotThreeDotIMGFilePath);
     }
     File.Copy(testDotOneDotIMGFilePath, testDotThreeDotIMGFilePath);
     using (IIMGArchive archive = IMGFile.Open(testDotThreeDotIMGFilePath, EIMGArchiveAccessMode.Update))
     {
         string entry_name = string.Empty;
         long   entry_size = 0;
         Assert.IsNotNull(archive);
         IReadOnlyDictionary <string, IIMGArchiveEntry> entries = archive.Entries;
         int entry_count = entries.Count;
         Assert.Less(0, entry_count);
         foreach (IIMGArchiveEntry entry in entries.Values)
         {
             entry_name = entry.FullName;
             Debug.WriteLine($"Unpacking file \"{ entry.FullName }\"");
             if (!(Directory.Exists("test")))
             {
                 Directory.CreateDirectory("test");
             }
             using (IIMGArchiveEntryStream img_archive_entry_stream = entry.Open())
             {
                 Assert.IsNotNull(img_archive_entry_stream);
                 entry_size = img_archive_entry_stream.Stream.Length;
                 Assert.AreEqual(entry_size, (long)(entry.Length));
                 img_archive_entry_stream.Stream.Seek(0L, SeekOrigin.End);
                 using (BinaryWriter img_archive_entry_stream_binary_writer = new BinaryWriter(img_archive_entry_stream.Stream, archive.EntryNameEncoding, true))
                 {
                     byte[] zero_bytes = new byte[2048];
                     img_archive_entry_stream_binary_writer.Write(zero_bytes);
                     img_archive_entry_stream_binary_writer.Flush();
                     entry_size += zero_bytes.Length;
                 }
             }
             break;
         }
         if (entry_count > 0)
         {
             entries = archive.Entries;
             Assert.AreEqual(entry_count, entries.Count);
             IIMGArchiveEntry another_entry = archive.GetEntry(entry_name);
             Assert.IsNotNull(another_entry);
             using (IIMGArchiveEntryStream img_archive_entry_stream = another_entry.Open())
             {
                 Assert.AreEqual(entry_size, img_archive_entry_stream.Stream.Length);
                 Assert.AreEqual(entry_size, another_entry.Length);
                 if (entry_size >= 2048)
                 {
                     entry_size -= 2048;
                     img_archive_entry_stream.Stream.SetLength(entry_size);
                 }
             }
         }
     }
 }
コード例 #3
0
ファイル: IMGArchive.cs プロジェクト: BigETI/IMGSharp
 /// <summary>
 /// Write IMG archive entry
 /// </summary>
 /// <param name="tempArchive">Temporary IMG archive</param>
 /// <param name="newEntry">New IMG archive entry</param>
 /// <param name="stream">Stream</param>
 private void WriteEntry(IMGArchive tempArchive, IIMGArchiveEntry newEntry, Stream stream)
 {
     using (IIMGArchiveEntryStream temporary_img_archive_entry_stream = tempArchive.InternalEntries[newEntry.FullName.ToLower()].Open())
     {
         byte[] temp_data = new byte[temporary_img_archive_entry_stream.Stream.Length];
         temporary_img_archive_entry_stream.Stream.Read(temp_data, 0, temp_data.Length);
         stream.Write(temp_data, 0, temp_data.Length);
     }
 }
コード例 #4
0
ファイル: IMGArchive.cs プロジェクト: BigETI/IMGSharp
 /// <summary>
 /// Commit IMG archive entry
 /// </summary>
 /// <param name="entry">IMG archive entry</param>
 /// <param name="entryStream">IMG archive entry stream</param>
 internal void CommitEntry(IIMGArchiveEntry entry, IIMGArchiveEntryStream entryStream)
 {
     try
     {
         if (AccessMode != EIMGArchiveAccessMode.Read)
         {
             string temporary_img_archive_path = Path.Combine(Path.GetTempPath(), $"{ Guid.NewGuid() }.img");
             if (File.Exists(temporary_img_archive_path))
             {
                 File.Delete(temporary_img_archive_path);
             }
             using (FileStream temporary_img_archive_file_stream = File.Open(temporary_img_archive_path, FileMode.Create))
             {
                 Stream.Seek(0L, SeekOrigin.Begin);
                 Stream.CopyTo(temporary_img_archive_file_stream);
             }
             using (IMGArchive temporary_img_archive = IMGFile.OpenRead(temporary_img_archive_path) as IMGArchive)
             {
                 if (temporary_img_archive != null)
                 {
                     InternalEntries.Clear();
                     Stream.SetLength(0L);
                     using (BinaryWriter stream_binary_writer = new BinaryWriter(Stream, EntryNameEncoding, true))
                     {
                         int entry_count                    = temporary_img_archive.InternalEntries.Values.Count + ((entry == null) ? 0 : (entry.IsNewEntry ? 1 : 0));
                         int first_entry_offset             = ((((entry_count * 32) % 2048) == 0) ? ((entry_count * 32) / 2048) : (((entry_count * 32) / 2048) + 1));
                         int current_entry_offset           = first_entry_offset;
                         List <IMGArchiveEntry> new_entries = new List <IMGArchiveEntry>();
                         Dictionary <string, IIMGArchiveEntry> temporary_entries = new Dictionary <string, IIMGArchiveEntry>(temporary_img_archive.InternalEntries);
                         long missing_byte_count;
                         stream_binary_writer.Write(IMGFile.SupportedIMGArchiveVersion);
                         stream_binary_writer.Write((short)entry_count);
                         if ((entry != null) && entry.IsNewEntry)
                         {
                             temporary_entries.Add(entry.FullName.ToLower(), new IMGArchiveEntry(temporary_img_archive, 0L, (int)(entryStream.Stream.Length), entry.FullName));
                         }
                         foreach (KeyValuePair <string, IIMGArchiveEntry> temporary_entry in temporary_entries)
                         {
                             int    entry_length   = (int)((entry == null) ? (((temporary_entry.Value.Length % 2048L) == 0L) ? (temporary_entry.Value.Length / 2048L) : ((temporary_entry.Value.Length / 2048L) + 1L)) : ((entry.FullName.ToLower() == temporary_entry.Key) ? (((entryStream.Stream.Length % 2048L) == 0L) ? (entryStream.Stream.Length / 2048L) : ((entryStream.Stream.Length / 2048L) + 1)) : (((temporary_entry.Value.Length % 2048L) == 0L) ? (temporary_entry.Value.Length / 2048L) : ((temporary_entry.Value.Length / 2048L) + 1L))));
                             byte[] name_bytes_raw = EntryNameEncoding.GetBytes(temporary_entry.Value.FullName);
                             byte[] name_bytes     = new byte[24];
                             Array.Copy(name_bytes_raw, name_bytes, Math.Min(name_bytes_raw.Length, name_bytes.Length));
                             stream_binary_writer.Write(current_entry_offset);
                             stream_binary_writer.Write((short)entry_length);
                             stream_binary_writer.Write(name_bytes);
                             IMGArchiveEntry new_entry = new IMGArchiveEntry(this, current_entry_offset * 2048, entry_length * 2048, temporary_entry.Value.FullName);
                             new_entries.Add(new_entry);
                             InternalEntries.Add(new_entry.FullName.ToLower(), new_entry);
                             current_entry_offset += entry_length;
                         }
                         foreach (IMGArchiveEntry new_entry in new_entries)
                         {
                             stream_binary_writer.Flush();
                             missing_byte_count = new_entry.Offset - Stream.Length;
                             if (missing_byte_count > 0L)
                             {
                                 stream_binary_writer.Write(new byte[missing_byte_count]);
                             }
                             if (entry != null)
                             {
                                 if (entry.FullName == new_entry.FullName)
                                 {
                                     byte[] data = new byte[entryStream.Stream.Length];
                                     entryStream.Stream.Seek(0L, SeekOrigin.Begin);
                                     entryStream.Stream.Read(data, 0, data.Length);
                                     Stream.Write(data, 0, data.Length);
                                 }
                                 else
                                 {
                                     WriteEntry(temporary_img_archive, new_entry, Stream);
                                 }
                             }
                             else
                             {
                                 WriteEntry(temporary_img_archive, new_entry, Stream);
                             }
                         }
                         stream_binary_writer.Flush();
                         missing_byte_count = current_entry_offset - (Stream.Length / 2048);
                         if (missing_byte_count > 0)
                         {
                             stream_binary_writer.Write(new byte[missing_byte_count]);
                         }
                         stream_binary_writer.Flush();
                     }
                 }
             }
             if (File.Exists(temporary_img_archive_path))
             {
                 File.Delete(temporary_img_archive_path);
             }
         }
     }
     catch (Exception e)
     {
         Console.Error.WriteLine(e);
     }
 }
コード例 #5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="imgArchiveEntry">IMG archive entry</param>
 public IMGArchiveEntryStream(IIMGArchiveEntry imgArchiveEntry)
 {
     IMGArchiveEntry = imgArchiveEntry;
     Stream          = new MemoryStream();
 }