2017-01-03 7 views
2

У меня есть консольное приложение, которое перечисляет файлы docx в папке и преобразует их в другой тип файла (например, pdf).Открытие каждого файла docx в папке и сохранение в виде другого типа файлов

Вот код:

Sub Main() 
    For Each arg As String In My.Application.CommandLineArgs 
     Select Case Trim(LCase(arg)) 
      Case "/docx-pdf" 
       Dim oWord As Word.Application 
       Dim oDoc As Word.Document 
       Dim path As String 
       Console.WriteLine("Podaj scieżkę folderu:") 
       path = Console.ReadLine() 
       Dim files As String() = Directory.GetFiles(path + "/", "*.docx") 
       For Each file As String In files 
        oWord = CreateObject("word.application") 
        oWord.Visible = False 
        oDoc = oWord.Documents.Open(file, ReadOnly:=True) 
        oDoc.SaveAs(FileName:=file.Replace(".docx", ".pdf"), FileFormat:=Word.WdSaveFormat.wdFormatPDF) 
        oWord.Quit() 
       Next 
     End Select 
    Next 
End Sub 

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

О чем я забыл?

+0

Не могли бы вы перевести ошибку? Лучший способ узнать, куда он идет не так, - это пройти через свой код с помощью отладчика. –

ответ

2

Вы получаете открытия ошибку о том, что «возможно файл поврежден», скорее всего, потому что ваша подстановочные *.docx также приводит к включению временных файлов, созданных Словом, когда DOCX файлы открыты для редактирования файлов (более конкретно здесь: KB 211632 – see paragraph Owner File) которые имеют имя файла, начинающееся с знака тильды и доллара (~$), например ~$nualReport.docx. Эти файлы не содержат содержимого документа, а только имя входа пользователя, открывшего соответствующий файл DOCX. Вы пытаетесь открыть эти файлы владельца с помощью Microsoft Word, что действительно не удается.

У вас есть два варианта, как решить эту проблему:

  1. полагаться на то, что эти владельцы файлы фактически скрыты (то есть h attrbute набор) так получить только список без скрытых файлов DOCX

  2. тест имя каждого файла перед обработкой, и если он начинается с ~$, просто использовать Continue For пропустить дальнейшую обработку файла (я рекомендую эту опцию)

    '... 
        For Each file As String In files 
         If IO.Path.GetFileName(file).StartsWith("~$") Then Continue For 'inserted line 
         oWord = CreateObject("word.application") 
         '... 
    

+0

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

+0

Хорошо, я проверил его, и вы правы, но второй вариант ничего не меняет. – xeN

+0

@xeN - исправлена ​​проблема. Я заменил 'файл' на' IO.Path.GetFileName (файл) ', потому что каждый файл на самом деле полный путь. Теперь 'StartsWith()' будет работать так, как ожидалось. – miroxlav

1

Хорошо, второй вариант не работает для меня, поэтому я сделал это так:

Sub Main() 
    For Each arg As String In My.Application.CommandLineArgs 
     Select Case Trim(LCase(arg)) 
      Case "/docx-pdf" 
       Dim oWord As Word.Application 
       Dim oDoc As Word.Document 
       Dim path As String 
       Console.WriteLine("Podaj scieżkę folderu:") 
       path = Console.ReadLine() 
       Dim afiles As String() = Directory.GetFiles(path + "\", "*.docx") 
       Dim bfiles As String() = Directory.GetFiles(path + "\", "~$*") 
       Dim cfiles = afiles.Except(bfiles) 
       For Each file As String In cfiles 
        oWord = CreateObject("word.application") 
        oWord.Visible = False 
        oDoc = oWord.Documents.Open(file, ReadOnly:=True) 
        oDoc.SaveAs(FileName:=file.Replace(".docx", ".pdf"), FileFormat:=Word.WdSaveFormat.wdFormatPDF) 
        oWord.Quit() 
       Next 
     End Select 
    Next 
End Sub 

Любой другой способ, чтобы написать его немного короче и чище?