public static SlfFile Create(DirectoryInfo aDir, string aSearchPattern, SearchOption aSearchOptions) { FileInfo[] _files = aDir.GetFiles(aSearchPattern, aSearchOptions); if (_files == null || _files.Length == 0) { return(null); } SlfFile.Header FHeader = new Header(); FHeader.LibName = String.Format("{0}.SLF", aDir.Name); if (aSearchOptions == SearchOption.AllDirectories) { FHeader.PathToLibrary = String.Format("{0}\\", aDir.Name); } else { FHeader.PathToLibrary = String.Empty; } FHeader.iEntries = _files.Length; FHeader.iUsed = _files.Length; FHeader.iSort = -1; FHeader.iVersion = 512; DirectoryInfo[] _subDirs = aDir.GetDirectories(); FHeader.fContainsSubDirectories = (byte)(_subDirs.Length > 0 ? 1 : 0); int _dirLength = aDir.FullName.Length + 1; SlfFile.Record[] _records = new SlfFile.Record[_files.Length]; SlfFile.Record[] FRecords = new SlfFile.Record[FHeader.iEntries]; for (int i = 0; i < _files.Length; i++) { FileInfo _file = _files[i]; SlfFile.Record.Header _recHeader = new Record.Header(); _recHeader.FileName = _file.FullName.Substring(_dirLength); _recHeader.FileTime = _file.CreationTimeUtc; _recHeader.uiLength = (uint)_file.Length; SlfFile.Record _rec = new Record(_recHeader); using (FileStream _fs = new FileStream(_file.FullName, FileMode.Open)) { _rec.LoadData(_fs); } FRecords[i] = _rec; string _key = _rec.FileName; if (_rec.State != FileOk) { _key = String.Format("{0}_{1}", _rec.FileName, _rec.State); } } SlfFile _slf = new SlfFile(FHeader, FRecords); return(_slf); }
private void LoadHeader(FileStream aInput) { Deserializer _deserializer = new Deserializer(aInput); this.FHeader = (Header)_deserializer.Deserialize(typeof(Header)); this.FRecords = new Record[this.FHeader.iEntries]; //Заголовки файлов в конце SLF-архива!!! aInput.Seek(-RecordHeaderSize * FHeader.iEntries, SeekOrigin.End); for (int i = 0; i < FHeader.iEntries; i++) { Record.Header _recordHeader = (Record.Header)_deserializer.Deserialize(typeof(Record.Header)); Record _record = new Record(_recordHeader); this.FRecords[i] = _record; } }