打开文件夹中的每个docx文件并另存为其他文件类型

时间:2017-01-03 14:32:32

标签: vb.net ms-word console

我有一个控制台应用程序,它在文件夹中列出docx文件并将它们转换为另一种文件类型(例如pdf)。

此处的代码:

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错误(至少它看起来像那样)。

我忘记了什么?

2 个答案:

答案 0 :(得分:2)

您正在收到文件打开错误,说“文件可能已损坏”,因为您的通配符*.docx也会导致在DOCX文件打开进行编辑时包含Word创建的临时文件(更具体地说,这里:KB 211632 – see paragraph Owner File)文件名以波浪号和美元符号(~$)开头,例如~$nualReport.docx。这些文件不包含文档内容,只包含打开相应DOCX文件的人的登录名。您正试图使用​​Microsoft Word打开这些所有者文件确实失败。

您有两种选择如何解决此问题:

  1. 依赖于这些所有者文件实际上是隐藏的(具有h属性集),因此只获取非隐藏的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")
            '...
    

答案 1 :(得分:1)

好的,第二个选项对我不起作用所以我这样做了:

ShapeType r = shapes.stream()
        .map(s -> ShapeType.parse(s.getSides()))
        .filter(c -> c == ShapeType.Hexagon || c==ShapeType.Square)
        .max(ShapeType::compareTo)
        .orElse(ShapeType.Generic);

还有其他方法可以把它写得更短更干净吗?