2017-01-03 51 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也導致列入由Word創建的臨時文件,只要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

我同意這個建議,如果不是,那麼暫時將它包裝在try catch中,並在異常輸出中輸出關於該文件的一些詳細信息,例如name等,以便我們可以嘗試和進一步提供幫助。 –

+0

好的,我查了一下,你是對的,但第二個選項不會改變任何東西。 – xeN

+0

@xeN - 問題已更正。我用'IO.Path.GetFileName(file)'替換了'file',因爲每個文件實際上都是完整路徑。現在'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 

任何其他方式來寫有點短和更清潔的?

相關問題