Перед написанием статьи, стоит отметить, что проблема, описанная в вопросе, связана с обработкой мультипотоковых WMV файлов в Delphi, где filenames содержат некорректные символы, а именно двоеточие, что приводит к созданию альтернативных потоков данных внутри одного файла. В Windows Explorer и других средствах, работающих с файловой системой, такие имена файлов отображаются некорректно, и основной поток данных часто не распознается.
Обработка мультипотоковых WMV файлов в Delphi: решение проблемы некорректных имен файлов
Введение
При работе с мультипотоковыми файлами в Delphi, разработчики могут столкнуться с проблемой, когда имена файлов, содержащие двоеточие, интерпретируются операционной системой как создание альтернативных потоков данных внутри основного файла. Это может вызвать трудности при чтении и обработке таких файлов.
Проблема
Имя файла в формате 123:123.wmv в системе Windows будет отображаться как 123, при этом основной поток данных будет пустым, и файлы альтернативных потоков данных не будут доступны для прямого чтения.
Решение
Для решения этой проблемы можно использовать функцию NtQueryInformationFile, которая позволяет получить информацию о потоках данных внутри файла. Пример кода на Object Pascal (Delphi) для чтения имен потоков и данных из каждого потока:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uGeneralStuff;
type
_FILE_STREAM_INFORMATION = record
NextEntryOffset: cardinal;
StreamNameLength: cardinal;
StreamSize: int64;
StreamAllocationSize: int64;
StreamName: array[0..MAX_PATH] of WideChar;
end;
PFILE_STREAM_INFORMATION = ^_FILE_STREAM_INFORMATION;
// Остальная часть интерфейса...
end.
implementation
uses Math, StrUtils;
{$R *.dfm}
function TForm1.ReadStreams(filename: String): TStringList;
var
iFH1: Integer;
aFileName: array[0..MAX_PATH] of WideChar;
aStreamName: String;
begin
Result := TStringList.Create;
iFH1 := FileOpen(filename, GENERIC_READ);
NtQueryInformationFile(iFH1, @StatusBlock, @InfoBlock, SizeOf(InfoBlock), 22); // 22 соответствует FileStreamInformation
FileClose(iFH1);
while (1=1) do
begin
if InfoBlock.StreamNameLength = 0 then
break;
CopyMemory(@aFileName, @InfoBlock.StreamName, InfoBlock.StreamNameLength);
aStreamName := Copy(aFileName, 1, PosEx(':', aFileName, 2) - 1);
if aStreamName <> '' then // Игнорировать главный поток, если в него не писались данные
Result.Add(aStreamName);
if (InfoBlock.NextEntryOffset = 0) then
break;
InfoBlock := PFILE_STREAM_INFORMATION(PByte(@InfoBlock) + InfoBlock.NextEntryOffset)^;
end;
end.
// Остальная часть реализации...
Пример использования
Для получения списка потоков данных в файле можно использовать следующий код:
procedure TForm1.Button2Click(Sender: TObject);
var
aStreams: TStringList;
I: Integer;
begin
aStreams := ReadStreams('C:\Temp\123');
for I := 0 to aStreams.Count - 1 do
begin
ShowMessage(ReadFile('C:\Temp\123' + aStreams[I]));
end;
end;
Заключение
Использование функции NtQueryInformationFile позволяет получить список потоков данных внутри мультипотокового файла и обработать данные каждого потока отдельно. Это решение может быть полезно при работе с файлами, созданными в Windows Media Encoder, которые содержат некорректные имена файлов с двоеточием.
Подтвержденный ответ
Использование альтернативных потоков данных (alternate data streams, ADS) является частью функциональности файловой системы Windows и может быть использовано для хранения дополнительных данных в рамках одного файла. Для работы с ADS можно использовать функцию NtQueryInformationFile, которая позволяет получить информацию о всех потоках данных в файле.
Альтернативные подходы
Существуют и другие способы работы с альтернативными потоками данных, например, использование функции FindFirstFileEx с указанием дополнительных параметров поиска.
Важные замечания
Работа с альтернативными потоками данных требует особой осторожности, так как обычные операции с файлами могут не распознавать или некорректно обрабатывать данные в альтернативных потоках.
Проблема связана с обработкой мультипотоковых WMV файлов в Delphi, где filenames с двоеточием приводят к созданию альтернативных потоков данных и некорректному отображению в Windows Explorer.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS