2013-03-21 2 views
0

У меня есть приложение, использующее корневую папку C: //. Эта папка содержит изображения. Эти изображения считываются с помощью Pictureboxes.Чтение файла, пока он вызван другим процессом

  1. Изображения поступают с Linux-машины по FTP. Линукс-машина использует ftp для открытия корня C: //, который находится в окнах. Сохраните IMAGE_1.jpg.
  2. IMAGE_1.jpg читается приложением формы C# для отображения в окне изображения.

Изображения поступают каждые 10 секунд от машины linux. Windows показывает эти изображения в потоке.

Иногда исключение исключений из linux или windows. Потому что, хотя один из них пытается прочитать изображение, чтобы показать (окна), другой пытается сохранить изображение (linux)

Поэтому я должен понимать, что если Image_1.jpg используется машиной linux, не попробуйте показать изображение в форме выигрыша.

Но как?

+0

Можете ли вы изменить приложение/скрипт на машине linux? – azhrei

+0

Нет, это невозможно, Linux-машина - это клиент, windows - сервер, в приложении это должно быть удержано на окнах. –

+0

Что вы подразумеваете под «каждые 10 секунд»? Является ли linux-машиной ftp одним файлом за раз, и после того, как он завершает загрузку файла, он ждет не менее 10 секунд, прежде чем он начнет загружать новый файл? – azhrei

ответ

1

В вашем приложении Win Forms откройте файл для чтения и поделитесь файлом с другими процессами, чтобы они могли продолжать чтение/запись в файл.

Используйте File.Open Method (String, FileMode, FileAccess, FileShare) для этого.

Если вы просто используете File.Open Method (String, FileMode) или File.Open Method (String, FileMode, FileAccess), тогда файл будет не разделен.

Делитесь, вы должны быть уверены, что сторона ftp довольна.

Если вы получаете исключение при попытке открыть файл в Windows - это нормально. Просто поймайте исключение и повторите попытку в ближайшее время.

Когда вы успешно откроете файл, проверьте, являются ли последние два байта FF D9. В этом случае ваш JPG завершил загрузку.

Вот несколько псевдокодов.


    success = false 
    using (FileStream fs = File.Open(path, // eg your Image1.jpg 
            FileMode.Open, 
            FileAccess.Read, // we just need to read 
            FileShare.ReadWrite)) // important to share! 
    { 
     // if last two bytes are FF D9 then 
     // success = true... can display image now 
    } 
    if (!success) 
    { 
     // file is being uploaded, or some other problem occurred 
     // try again later 
    } 

+0

Дорогой ажрей, я просто делаю это, прежде чем задаю свой вопрос: using (FileStream ImgFileStream = новый FileStream (путь, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { RefImg = Image.FromStream (ImgFileStream); Однако, я по-прежнему получаю сообщение об ошибке со стороны FTP, несколько раз –

+0

ok - звучит для меня, возможно, у вас есть несколько проблем - почему бы вам не объяснить, какие ошибки вы видите на стороне FTP? (отредактируйте исходный вопрос) – azhrei

+0

Дорогой ажрей и Максим Вернье, я изменил свой алгоритм, изменил поток, а также использовал ваши предложения о файлообмене и файлах, эта комбинация решила мою проблему. большое спасибо. –

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