public void ExtractMPQ(string fileName, string listFile) { Progress_MaxFiles = 1; if (File.Exists(fileName)) { if (Storm.SFileOpenArchive(fileName, 2, 0x8000, ref hMpq)) { // List file contents List <string> listFileContent = new List <string>(); // Valid files in MPQ List <string> validMPQFiles = new List <string>(); // Verify if list file exists if (!File.Exists(listFile)) { MessageBox.Show("Unable to extract DIABDAT.MPQ without a list file!", "EQUINE MPQEdit", MessageBoxButtons.OK, MessageBoxIcon.Stop); done = true; return; } // Set the progress string progressString = "Reading listfile..."; // Read contents of listfile into List listFileContent = File.ReadAllLines(listFile).ToList(); // loop through the listfile and probe the MPQ for valid files inside the MPQ for (int i = 0; i < listFileContent.Count(); i++) { progressString = "Probing file:\n" + listFileContent[i]; hFile = 0; if (Storm.SFileOpenFileEx(hMpq, listFileContent[i], 0x00, ref hFile)) { validMPQFiles.Add(listFileContent[i]); } if (hFile != 0) { Storm.SFileCloseFile(hFile); } } // create the folder for DIABDAT.MPQ inside EquineData progressString = "Preparing folder..."; try { Directory.CreateDirectory("EquineData/DIABDAT"); } catch { MessageBox.Show("Can't create folder for extracted files!", "EQUINE MPQEdit", MessageBoxButtons.OK, MessageBoxIcon.Stop); done = true; return; } // create the valid list file for DIABDAT.MPQ File.WriteAllLines("EquineData/DIABDAT/DIABDAT.listfile.txt", validMPQFiles); // report to Progress_MaxFiles Progress_MaxFiles = validMPQFiles.Count(); // and finally extract the files for (int i = 0; i < validMPQFiles.Count(); i++) { int _hFile = -1; progressString = "Extracting file:\n" + validMPQFiles[i]; if (!cancel) { if (Storm.SFileOpenFile(validMPQFiles[i], ref _hFile)) { uint fileSizeHigh = 0; uint fileSize = Storm.SFileGetFileSize(_hFile, ref fileSizeHigh); if ((fileSizeHigh == 0) && (fileSize > 0)) { byte[] bs = new byte[fileSize]; uint countRead = 0; Storm.SFileReadFile(_hFile, bs, fileSize, ref countRead, 0); if (!Directory.Exists(Path.GetDirectoryName("EquineData/DIABDAT/" + validMPQFiles[i]))) { Directory.CreateDirectory(Path.GetDirectoryName("EquineData/DIABDAT/" + validMPQFiles[i])); } FileStream F = new FileStream("EquineData/DIABDAT/" + validMPQFiles[i], FileMode.Create, FileAccess.ReadWrite); F.Write(bs, 0, bs.Length); F.Close(); Storm.SFileCloseFile(_hFile); } } Progress_File = i; } if (cancel) { break; } } // we done :) done = true; Success = true; Storm.SFileCloseArchive(hMpq); } else { MessageBox.Show("Couldn't open DIABDAT.MPQ for reading.", "EQUINE MPQEdit", MessageBoxButtons.OK, MessageBoxIcon.Stop); done = true; return; } } // close the file if (hFile != 0) { Storm.SFileCloseFile(hFile); } }