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

Vb.net 打开文件夹中的每个docx文件并另存为其他文件类型,vb.net,ms-word,console,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

我有一个控制台应用程序,列出文件夹中的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
我的问题是,在转换文件夹中的每个文件后,应用程序试图打开另一个不存在的文件,我遇到了错误(至少看起来是这样)


我忘记了什么?

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

您有两种解决方法:

  • 依赖于这些所有者文件实际上是隐藏的(具有
    h
    attrbute集),所以只获取非隐藏DOCX文件的列表

  • 在处理前测试每个文件名,如果文件名以
    ~$
    开头,只需使用
    Continue For
    跳过对文件的进一步处理(我建议使用此选项)


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

    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
    

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

    你能翻译一下错误吗?找出错误所在的最佳方法是使用调试器逐步检查代码。如果不这样做,我同意这一建议,然后将其临时包装在try-catch中,并在异常情况下输出有关文件的一些详细信息,例如名称等,以便我们可以尝试进一步帮助。好的,我检查了它,您是对的,但第二个选项不会改变任何东西。@xeN–问题已纠正。我用
    IO.Path.GetFileName(file)
    替换了
    file
    ,因为每个文件实际上都是完整的路径。现在
    StartsWith()
    将按预期工作。
    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