2010-08-24 4 views
1

На нашем файловом сервере Windows установлена ​​служба архивирования, в которой файлы «заглушки» не были доступны в течение определенного периода времени. Когда запрос на зашитый файл отправляется на сервер, служба архива заменяет заглушку исходным документом и обслуживает ее для пользователя.Как обновить миниатюру файла в проводнике Windows?

Основная жалоба на услугу архива заключалась в том, что миниатюры для фотографий больше не доступны. Я решил создать программу на C#, которая позволит пользователю выбрать папку и разбить все файлы в ней. Он делает это, прочитав первый байт каждого файла в папке:

if (Directory.Exists(path)) 
{ 
    DirectoryInfo di = new DirectoryInfo(path); 
    FileInfo[] potentiallyStubbedFiles = di.GetFiles(); 
    foreach (FileInfo fi in potentiallyStubbedFiles) 
    { 
     //ignore Thumbs.db files 
     if(!fi.Name.Equals("Thumbs.db")) 
     { 
      Console.WriteLine("Reading " + fi.Name); 
      try 
      { 
       FileStream fs = File.Open(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.None); 

       try 
       { 
        //read the first byte of the file, forcing it to be unstubbed 
        byte[] firstByte = new byte[1]; 
        fs.Read(firstByte, 0, 1); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("An error occurred trying to read " + fi.Name + ":"); 
       } 

       fs.Close(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("An error occurred trying to open " + fi.Name + ":"); 
      } 
     } 
    } 
    Console.WriteLine("Finished reading files."); 
} 
else 
{ 
    Console.WriteLine("\"" + path + "\" is not a valid directory."); 
} 

Он хорошо работает, но у меня есть одна небольшая проблема, которую я хотел бы решить.

В Windows 7, когда FileStream закрыт, Windows Explorer обновляет файл и показывает правильную миниатюру, поэтому вы можете видеть миниатюру каждого файла по мере его ненакраски. Однако в Windows XP Explorer не обновляет файлы до выхода программы, заставляя пользователя ждать до . Все файлы были нераскрыты, прежде чем они смогут их просматривать.

Есть ли способ заставить Windows XP воссоздать миниатюру для файла сразу после его чтения? Какой сигнал подан для обновления файлов после закрытия программы? Или я об этом совершенно неправильно?

+0

Этот вопрос меня интересует. Я добавил щедрость. – Stephen

+0

С тех пор мне не повезло. Тем не менее, я замечаю, что если я заставляю поток спать в течение нескольких секунд, все файлы, которые были обработаны, будут обновлены. – Torai

+0

Ну, если вы решите это, ответьте на этот вопрос в ответ на эту должность в течение недели, и я дам вам щедрость: p. – Stephen

ответ

0

Попробуйте SHChangeNotify с SHCNE_UPDATEITEM.

+0

Я потратил много времени, пытаясь заставить SHChangeNotify работать без успеха. Было бы очень полезно, если бы я мог отлаживать вызов метода dll. Есть ли способ сделать это? – Torai

+1

будьте осторожны, чтобы передать правильный параметр SHCNF_PATH (например, SHCNF_PATHW для Unicode). Передайте pidl файла, если сможете. –

+1

Спасибо. В конце концов, я начал работать. Вот класс ShellNotification, из которого я могу вызвать refreshThumbnail (fi.FullName) из-за неупорядочения файла: http://pastebin.com/7VnfiKX6 В настоящий момент это немного грубо, но выполняет эту работу. Другими источниками, которые я использовал, являются: http://viewontv.codeplex.com/SourceControl/changeset/view/52406#939762 и http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3d9c048a- 1bcc-4842-be7c-08b545cd456e – Torai

1

Интерфейс с Windows XP не отображается. Vista и выше представляют интерфейс IThumbnailCache.

Не могли бы вы удалить thumbs.db и заставить его таким образом?

Формат большого пальца недокументирован, но есть проект в http://vinetto.sourceforge.net/, который пытается понять его, что может дать некоторые указатели, если вы хотите изучить.

+0

Спасибо за ответ, но изменение thumbs.db не даст мне живого обновления миниатюры файла. – Torai

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