通过选择序列中的单个文件打开多个文件 - 从多个文件生成文件名

Open multiple files by selecting single file in a sequence - Generate file name from multiple files

我有一个 UWP 应用程序,可以选择打开图像序列。通常图像序列命名如下:

MyImageSequence_00001.png, MyImageSequence_00002.png, ... MyImageSequence_01024.png, MyImageSequence_01025.png,

通常,这些图像序列将被命名为类似“UniqueFileName_v06”的名称,并在后面加上类似“_0004”的帧编号。在很多情况下,同一个文件夹中可能有多个图像序列,但它们会有不同的前导名称,例如“UniqueFileName_v04_Reflections”或“UniqueFileName_v04_Depth”。起始帧号可以是任意数字,帧号会依次增加到序列的最后一帧。

我目前让用户 select 手动处理所有文件,如下所示:

        FileOpenPicker filePicker = new FileOpenPicker();
        filePicker.ViewMode = PickerViewMode.List:
        filePicker.FileTypeFilter.Add(".png");
        filePicker.FileTypeFilter.Add(".jpg");
        filePicker.FileTypeFilter.Add(".tif");

        files = await filePicker.PickMultipleFilesAsync();

我希望做的是允许用户通过 select 从文件选择器中的序列中提取单个图像来打开他们的图像序列。因此,如果他们要 select “MyImageSequence_00003.png”,应用程序将找到并 select 序列中的其余文件 (MyImageSequence 00001-01025) 并将它们添加到 filePickerSelectedFilesArray变量files.

其次,我想从文件列表中生成一个复合字符串名称。因此,生成一个像“MyImageSequence_00001-01025”这样的名称来标识图像序列。

关于解决此问题的最佳方法有什么想法吗?似乎我应该使用 StorageItemsQuery class 之类的东西,但不确定这是否是最好的方法,也不确定如何去做。

感谢您提供的任何帮助!

我正在使用以下方法获取不带帧数的图像序列名称:

文件路径输入C:\Users\Me\Desktop\MyImageSequenceFolder\MyImageSequence_00001.png

string input = Path.GetFileNameWithoutExtension(fileFromImageSequence.Path);
string pattern = @"\d+$";
string replacement = "";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

sequenceName = result.TrimEnd('_');

sequenceName 输出为“MyImageSequence”

目前原生UWP应用无法通过路径访问文件(权限限制)

根据您的描述,图片序列都放在一个文件夹中。那么在通过FileOpenPicker选择文件之前,我们可以先获取该文件夹的访问权限,并将其添加到以后的访问列表中。

public async Task<StorageFolder> GetImageFolderAsync(string token = "")
{
    StorageFolder folder;
    if (string.IsNullOrEmpty(token))
    {
        var folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        folderPicker.FileTypeFilter.Add("*");
        folder = await folderPicker.PickSingleFolderAsync();
        if (folder != null)
        {
            string folderToken = StorageApplicationPermissions.FutureAccessList.Add(folder);
            // save token to LocalSettings or other location.
            // ...
        }
    }
    else
    {
        folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token);
    }
    return folder;
}

将文件夹添加到FutureAccessList后,我们会得到一个Token。以后我们不用打开就可以直接通过Token获取文件夹FolderPicker。这相当于用户授权应用程序访问该文件夹。

然后,当用户通过FileOpenPicker选择文件时,可以通过上面的方法获取文件夹,根据自己设置的规则在文件夹中查找相同类型的图片序列(如StorageItemsQuery).

public async Task<IReadOnlyList<StorageFile>> SearchSameImages(StorageFile fileFromImageSequence)
{
    string input = Path.GetFileNameWithoutExtension(fileFromImageSequence.Path);
    string pattern = @"\d+$";
    string replacement = "";
    Regex rgx = new Regex(pattern);
    string result = rgx.Replace(input, replacement);
    sequenceName = result.TrimEnd('_');

    var queryOptions = new QueryOptions();
    queryOptions.ApplicationSearchFilter = $"\"{sequenceName}\"";
    string token = GetToken(); // From LocalSettings or other place.
    var folder = await GetImageFolderAsync(token);

    var queryResult = folder.CreateFileQueryWithOptions(queryOptions);
    var files = await queryResult.GetFilesAsync();
    return files;
}

这样就可以让用户在应用第一次启动时指定一个文件夹来存放图片序列,启动后保留对该文件夹的访问权限。使用上面提供的方法,根据单个文件查询文件夹中的图片顺序。

谢谢。