Получить следующий файл в папке
Открывая изображение в средстве просмотра фотографий 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.
Изменить: Предыдущие файлы могут быть отслежены в связанном списке, когда пользователь переходит к следующему файлу. Логика по сути будет выглядеть так -
- Используйте связанный список для вашей предыдущей и следующей навигации.
- При первоначальной загрузке или клике
Next
Если связанный список или его следующий узел имеет значение null, используйтеGetNextFile
выше, чтобы найти следующий путь, отобразите его в пользовательском интерфейсе и добавьте в связанный список. - За
Previous
используйте связанный список для определения предыдущего пути.