2014-11-09 4 views
3

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

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

+2

Я уверен, что под обложками это список всех файлов в папке, а затем вопрос о следующем элементе списка. Я предполагаю, что потому, что было бы не очень эффективно запрашивать файловую систему каждый раз, когда – dotnetom

+0

получает все пути в коллекцию, добавляет счетчик, начиная с 0 и увеличивая/уменьшая счетчик, чтобы получить следующий/предыдущий путь. –

+0

Это будет довольно медленный процесс, если папка содержит большое количество файлов, не так ли? Возможно, есть другой назначенный путь. – SharpAffair

ответ

3

Вы можете сделать это легко, получив все пути в коллекцию и сохранив счетчик. Если вы не хотите загружать все пути к файлу в память, вы можете использовать метод 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; 
} 

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

+0

Я бы не рекомендовал этот метод вызова 'EumerateFiles' с' Skip' для каждого файла в каталоге. Это будет крайне неэффективно, особенно для каталогов с большим количеством файлов. –

+0

Это не кажется эффективным, и это не отвечает, как мы должны начинать с середины списка, как при открытии пользователем изображения в середине папки. –

1

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

(Примечание. В другом ответе работает предложение о вызове 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. 

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

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

как вы планируете получать предыдущий файл? –

+0

@ Selman22 Спасибо за ваш комментарий .. Я обновил свой ответ. –

Смежные вопросы