Получить следующий файл в папке

Открывая изображение в средстве просмотра фотографий Windows, вы можете перемещаться назад и вперед между поддерживаемыми файлами с помощью клавиш со стрелками (следующая фотография / предыдущая фотография).

Вопрос в том, как получить путь к следующему файлу с заданным путем к текущему файлу в папке?

2 ответа

Вы можете сделать это легко, поместив все пути в коллекцию и сохранив счетчик. Если вы не хотите загружать все пути к файлам в память, которую вы можете использовать Directory.EnumerateFiles а также Skip способ получить следующий или предыдущий файл. Например:

int counter = 0;

string NextFile(string path, ref int counter)
{
    var filePath = Directory.EnumerateFiles(path).Skip(counter).First();
    counter++;
    return filePath;
}

string PreviousFile(string path, ref int counter)
{
    var filePath = Directory.EnumerateFiles(path).Skip(counter - 1).First();
    counter--;
    return filePath;
}

Конечно, вам нужны дополнительные проверки, например, в NextFile вам нужно проверить, попали ли вы в последний файл, вам нужно сбросить счетчик, также в PreviousFile Вы должны убедиться, что счетчик не 0если да, верните первый файл и т. д.

Учитывая вашу озабоченность по поводу большого количества файлов в данной папке и желание загружать их по требованию, я бы рекомендовал следующий подход -

(Примечание - предложение о звонке Directory.Enumerate().Skip... в другом ответе работает, но не эффективно, особенно для каталогов с большим количеством файлов и несколькими другими причинами)

// Local field to store the files enumerator;
IEnumerator<string> filesEnumerator;

// You would want to make this call, at appropriate time in your code.
filesEnumerator = Directory.EnumerateFiles(folderPath).GetEnumerator();

// You can wrap the calls to MoveNext, and Current property in a simple wrapper method..
// Can also add your error handling here.
public static string GetNextFile()
{
    if (filesEnumerator != null && filesEnumerator.MoveNext())
    {
        return filesEnumerator.Current;
    }

    // You can choose to throw exception if you like..
    // How you handle things like this, is up to you.
    return null;
}

// Call GetNextFile() whenever you user clicks the next button on your UI.

Изменить: Предыдущие файлы могут быть отслежены в связанном списке, когда пользователь переходит к следующему файлу. Логика по сути будет выглядеть так -

  1. Используйте связанный список для вашей предыдущей и следующей навигации.
  2. При первоначальной загрузке или клике NextЕсли связанный список или его следующий узел имеет значение null, используйте GetNextFile выше, чтобы найти следующий путь, отобразите его в пользовательском интерфейсе и добавьте в связанный список.
  3. За Previous используйте связанный список для определения предыдущего пути.
Другие вопросы по тегам