问题描述
小弟初学C#,碰到一个问题,我要让winform显示指定文件夹中的PDF文件,我使用了adobereader自带的com组件,然后当指定文件夹中的PDF文件被替换的时候,窗体中的PDF组件也随着变换,我使用了.net的filesystemwatcher控件,随后问题也就来了,当打开一个窗口时,文件显示和替换后显示都没有问题,但同时打开5个窗口时,替换文件夹中的文件,则只能打开两个,其他一个显示在载入,剩下两个则完全没有反应,总结了下,应该是filesystemwatcher下的change事件同时让5个窗体一起访问了文件,导致了文件的无法载入,但我不知道解决的方法和思路,还是有相应的技术处理这种情况,(如果放在局域网,这种情况要如何解决),求各位大侠指点迷津...usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;namespacePDFDisplay{publicpartialclassMain:Form{publicMain(){InitializeComponent();}AxAcroPDFLib.AxAcroPDFaxAcroPDF=newAxAcroPDFLib.AxAcroPDF();privatevoidMain_Load(objectsender,EventArgse){fileSystemWatcher1.Path=GetPDFDocumentPath();fileSystemWatcher1.InternalBufferSize=1024;axAcroPDF.Location=newSystem.Drawing.Point(0,24);axAcroPDF.Size=newSystem.Drawing.Size(292,242);axAcroPDF.Dock=DockStyle.Fill;this.Controls.Add(axAcroPDF);axAcroPDF.setCurrentPage(GetFilePage());//获取要显示的页码axAcroPDF.LoadFile(GetPDFFilePath(GetPDFDocumentPath()));}///<summary>///获取文件夹位置///</summary>///<returns></returns>privatestringGetPDFDocumentPath(){stringConfigPath=Application.StartupPath+"/Config/FilePath.ini";stringPDFDocumentPath="";FileInfofif=newFileInfo(ConfigPath);DirectoryInfodif=newDirectoryInfo(Application.StartupPath+"/Config");if(dif.Exists){if(fif.Exists){StreamReadersr=newStreamReader(ConfigPath);PDFDocumentPath=sr.ReadLine();sr.Close();if(PDFDocumentPath.Length<0){MessageBox.Show("FilePath.ini文件中没有配置完全!");}}else{MessageBox.Show("文件不存在!");}}else{MessageBox.Show("文件夹不存在!");}returnPDFDocumentPath;}///<summary>///获取PDF文件路径///</summary>///<paramname="PDFDocumentPath">PDF文件夹路径</param>///<returns></returns>privatestringGetPDFFilePath(stringPDFDocumentPath){stringPDFFilePath="";DirectoryInfodif=newDirectoryInfo(PDFDocumentPath);if(dif.Exists){FileInfo[]fif=dif.GetFiles();foreach(FileInfoPDFFileNameinfif){PDFFilePath=PDFDocumentPath+PDFFileName.Name.ToString();}}else{MessageBox.Show("PDF存放文件夹已被移动或删除!");}returnPDFFilePath;}privatevoidfileSystemWatcher1_Changed(objectsender,FileSystemEventArgse){axAcroPDF.LoadFile(GetPDFFilePath(GetPDFDocumentPath()));}///<summary>///获取文件路径///</summary>///<returns></returns>privateintGetFilePage(){stringFilePage="";stringConfigPath=Application.StartupPath+"/Config/FilePath.ini";FileInfofif=newFileInfo(ConfigPath);DirectoryInfodif=newDirectoryInfo(Application.StartupPath+"/Config");if(dif.Exists){if(fif.Exists){StreamReadersr=newStreamReader(ConfigPath);sr.ReadLine();FilePage=sr.ReadLine();sr.Close();}}if(FilePage==null){return1;}else{returnInt32.Parse(FilePage);}}}}
解决方案
解决方案二:
LZ要考虑一下多线程貌似多个线程同时访问一个文件不能像LZ这样处理的如果要多个线程访问,可以先将PDF复制一个,给个随机文件名,去访问副本,访问结束再把它删除也许可以解决LZ的问题