2016-02-04 2 views
0

Я использую C# для преобразования .doc в .pdf. .Doc находится на сайте поставщика. Чтобы получить .doc, мы должны нажать на кнопку, которая предоставляет нам опцию Open, Save, or Cancel. Когда пользователь нажимает кнопку Save, он запрашивает местоположение. Пользователь выбирает местоположение в подключенном диске, скажем, S:\Some Folder\abc.doc, а фактическое местоположение папки - \\server\\folder\Some Folder. Здесь моя программа входит в игру. Я использую класс FileSystemWatcher в C# с фильтром, установленным для файлов .doc. Я могу отлаживать, что файл найден. Расположение папки жестко запрограммировано и сохранено как фактическое местоположение папки, упомянутое выше. Пользователь и приложение имеют полное разрешение на доступ к папке. Однако, когда я запускаю программу, я получаю FileNotFoundException.Преобразование документа в pdf с использованием Interop.Word C#

Это то, что у меня есть

 WriteToFile("Starting Word application"); 
     Application word = new Application(); 

     object missing = Type.Missing; 

     var sourcefile = new FileInfo(path); 

     // check if the created file ends with .doc. 
     System.Diagnostics.Debug.WriteLine(path); 
     if (!path.ToLower().EndsWith(".doc")) 
     { 
      return ""; 
     } 

     word.Visible = false; 

     WriteToFile("Opening doc as read only"); 
     // open readonly    
     System.Diagnostics.Debug.WriteLine(sourcefile.FullName); 
     var doc = word.Documents.Open(FileName: sourcefile.FullName, ReadOnly: true); 

Странная вещь sourcefile.FullName не показывает жесткий кодированный адрес сервера, который path установлен в. Он показывает путь к файлу как S:\Some Folder\abc.doc, что не имеет для меня никакого смысла. Что здесь происходит, и почему он не может найти файл?

+1

Работает ли она в ожидании в среде IDE, если вы ждете несколько секунд после события FSW, но до того, как будет запущен код выше? –

+0

Я этого не пробовал. Я сейчас. Но, что еще больше беспокоит, даже если я предоставляю исходный файл жестко закодированным как «\\ server \ ...», отладчик все еще говорит мне, что он не может найти 'S: \ Some Folder \ abc.doc'. Моя программа ничего не знает о диске S. Итак, как это выбрать, если только он не считывает атрибут файла из самого имени файла, который он нашел, правильно? – user1828605

+0

@AlexK. Ты был прав. Я должен был ждать несколько секунд после события FSW. Я добавил Thread.Sleep (5000) перед запуском кода и после того, как было запущено событие FSW OnCreated. Это работало безупречно. Извините, мне потребовалось некоторое время, чтобы поработать над этим. Не могли бы вы добавить свой комментарий в качестве ответа, чтобы я мог отметить его как правильный ответ? Спасибо. – user1828605

ответ

1

Событие OnCreate может срабатывать, когда основной файл все еще используется/записывается, что может вызвать проблемы, если вы сразу же попытаетесь получить к нему доступ.

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

0

Я предполагаю, что вы используете неправильный объект FileInfo. Попробуйте создать новый или используйте

System.IO.Path.Combine(@"\\server\folder\Some Folder", "sourcefile.Name") 

который вы также можете использовать для создания нового объекта FileInfo. Объект, который вы используете, вероятно, является одним из диалогового окна пользователя, которое использует сопоставленный диск. У вас также есть опечатка в вашем местоположении. \\SERVERNAME\\ не является UNC-контуром. В начале строки должно быть только две обратные косые черты. Это должно быть

@"\\server\folder\Some Folder" 

WriteToFile("Starting Word application"); 
Application word = new Word.Application(); 

object missing = Type.Missing; 

var sourcefile = new System.IO.FileInfo(path); 
string SomeShare = @"\\SomeServer\Someshare\Somepath"; 
System.IO.FileInfo WorkFile = new System.IO.FileInfo(System.IO.Path.Combine(SomeShare, sourcefile.Name)); 

// check if the created file ends with .doc. 
System.Diagnostics.Debug.WriteLine(path); 
if (!path.ToLower().EndsWith(".doc")) 
{ 
    return ""; 
} 

word.Visible = false; 

WriteToFile("Opening doc as read only"); 
// open readonly    
System.Diagnostics.Debug.WriteLine(sourcefile.FullName); 
var doc = word.Documents.Open(FileName: WorkFile.FullName, ReadOnly: true); 
} 

Это прекрасно работает для меня, оно обновляет путь к правильному шаблону UNC. Если файл по-прежнему не доступен, вы должны проверить, можно ли его открыть на рабочей станции, используя созданный вами путь UNC.

+0

'\\ SERVERANAME \\' был просто опечаткой. Я внедрил ваше предложение, но даже с этим я все равно получаю то же сообщение об ошибке. И он по-прежнему выбирает сопоставленный диск вместо фактического расположения сервера. Я не понимаю. И файл существует. – user1828605

+0

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

+0

Я не знаю, могу ли я назвать это, проходя путь по диалоговому окну. Потому что путь задан как «\\ имя_сервера \ папка ..» в Путь класса 'FileSystemWatcher'. И я использую 'OnCreate (object sender, FileSystemEventArgs e)' с 'sourcepath = e.FullPath'. Если e.FullPath вызывает эту проблему, я не знаю об этом. В противном случае код кода не знает о «S: \», кроме того, что S-диск отображается на машине-разработчике. Я не думал, что это важно. Ну, это не имеет значения, если пользователь открывает документ и клики «Сохранить как», то программа не имеет ошибки, имеет другую. – user1828605

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