/// <summary> /// Scans directory entries and return the a file descriptor (string.EndsWith is used) /// </summary> /// <param name="p4kFilename">The p4k file</param> /// <param name="filename">The filename to look for</param> public p4kFile ScanDirectoryFor(string p4kFilename, string filename) { if (!File.Exists(p4kFilename)) { return(null); } using (p4kRecReader reader = new p4kRecReader(p4kFilename)) { // work from the end of the file reader.GotoLastPage( ); m_endOfCentralDirRecord = new p4kEndOfCentralDirRecord(reader); // position first reader.Seek(m_endOfCentralDirRecord.RecordOffset - p4kRecReader.PageSize); m_z64EndOfCentralDirLocator = new p4kZ64EndOfCentralDirLocator(reader); // for the next the position should be found already - seek it reader.Seek(m_z64EndOfCentralDirLocator.Z64EndOfCentralDir); m_z64EndOfCentralDirRecord = new p4kZ64EndOfCentralDirRecord(reader); // now we should have the start of the directory entries... // position first reader.Seek(m_z64EndOfCentralDirRecord.Z64StartOfCentralDir); // loop all file - as per dir reporting for (long i = 0; i < m_z64EndOfCentralDirRecord.NumberOfEntries; i++) { p4kDirectoryEntry de = new p4kDirectoryEntry(reader); if (!string.IsNullOrEmpty(filename) && de.Filename.ToLower( ).EndsWith(filename.ToLower( ))) { var p = new p4kFile(de); // FOUND reader.TheReader.Close( ); return(p); // bail out if found } } } return(null); }
/// <summary> /// Scans directory entries and return the a list of matching file descriptors (string.Contains is used) /// </summary> /// <param name="p4kFilename">The p4k file</param> /// <param name="filenamepart">The filename part to look for</param> public IList <p4kFile> ScanDirectoryContaining(string p4kFilename, string filenamepart) { if (!File.Exists(p4kFilename)) { return(null); } List <p4kFile> fileList = new List <p4kFile>( ); using (p4kRecReader reader = new p4kRecReader(p4kFilename)) { // work from the end of the file reader.GotoLastPage( ); m_endOfCentralDirRecord = new p4kEndOfCentralDirRecord(reader); // position first reader.Seek(m_endOfCentralDirRecord.RecordOffset - p4kRecReader.PageSize); m_z64EndOfCentralDirLocator = new p4kZ64EndOfCentralDirLocator(reader); // for the next the position should be found already - seek it reader.Seek(m_z64EndOfCentralDirLocator.Z64EndOfCentralDir); m_z64EndOfCentralDirRecord = new p4kZ64EndOfCentralDirRecord(reader); // now we should have the start of the directory entries... // position first reader.Seek(m_z64EndOfCentralDirRecord.Z64StartOfCentralDir); // loop all file - as per dir reporting for (long i = 0; i < m_z64EndOfCentralDirRecord.NumberOfEntries; i++) { p4kDirectoryEntry de = new p4kDirectoryEntry(reader); if (!string.IsNullOrEmpty(filenamepart) && de.Filename.ToLower( ).Contains(filenamepart.ToLower( ))) { var p = new p4kFile(de); // FOUND fileList.Add(p); } } } return(fileList); }