2013-03-21 54 views
0

我有一个应用程序使用C://根文件夹。该文件夹包含图像。这些图像由Pictureboxes提供。读取文件虽然它是由另一个进程wrince

  1. 图像来自Linux机器通过FTP。一台linux机器使用ftp打开窗口中的C://根目录。保存IMAGE_1.jpg。
  2. IMAGE_1.jpg由C#窗体窗体应用程序支持显示在图片框中。

图像来自linux机器每10秒钟一次。 Windows在一个线程中显示这些图像。

有时,linux或windows发送异常。因为虽然其中一个试图读取图像来显示(Windows),另一个试图保存图像(linux)

因此,我必须明白,如果Image_1.jpg被Linux机器使用,请不要尝试以胜利形式显示图像。

但是如何?

+0

你能修改linux机器上的应用程序/脚本吗? – azhrei 2013-03-21 09:54:35

+0

不,这是不可能的,linux机器是客户端,windows是服务器,在应用程序中,这个必须在windows上保存 – 2013-03-21 09:55:44

+0

你是什么意思“每10秒”? linux机器一次只能ftp一个文件,并且在完成上传文件后,是否至少等待10秒钟,然后开始上传新文件? – azhrei 2013-03-21 10:05:07

回答

1

在您的Win Forms应用程序中,打开要读取的文件,并与其他进程共享该文件,以便他们可以继续读取/写入文件。

使用File.Open Method (String, FileMode, FileAccess, FileShare)来做到这一点。

如果您只是使用File.Open Method (String, FileMode)File.Open Method (String, FileMode, FileAccess)那么该文件将被取消共享。

通过分享,你应该保持事物的快乐。

如果在尝试打开W​​indows中的文件时出现异常 - 那很好。只要赶上例外情况并尽快再试。

当您成功打开文件时,检查最后两个字节是否为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

亲爱的azhrei,我只是这样做之前,我问我的问题: using(FileStream ImgFileStream = new FileStream(Path,FileMode。打开,FileAccess.Read,FileShare.ReadWrite)) { RefImg = Image.FromStream(ImgFileStream); } 但是,我仍然从FTP端得到错误,有时候 – 2013-03-21 11:54:56

+0

ok - 听起来我可能有几个问题 - 为什么你不解释你在FTP端看到的错误? (编辑您的原始问题) – azhrei 2013-03-21 12:09:03

+0

亲爱的azhrei和Maxime Vernier,我改变了我的算法,改变了线程,并且还使用了关于fileaccess和fileshare的建议,这个组合解决了我的问题。非常感谢。 – 2013-03-21 14:15:35

相关问题