我有一个控制台应用程序,它在文件夹中列出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错误(至少它看起来像那样)。
我忘记了什么?
答案 0 :(得分:2)
您正在收到文件打开错误,说“文件可能已损坏”,因为您的通配符*.docx
也会导致在DOCX文件打开进行编辑时包含Word创建的临时文件(更具体地说,这里:KB 211632 – see paragraph Owner File)文件名以波浪号和美元符号(~$
)开头,例如~$nualReport.docx
。这些文件不包含文档内容,只包含打开相应DOCX文件的人的登录名。您正试图使用Microsoft Word打开这些所有者文件确实失败。
您有两种选择如何解决此问题:
依赖于这些所有者文件实际上是隐藏的(具有h
属性集),因此只获取非隐藏的DOCX文件列表
在处理之前测试每个文件名,如果它以~$
开头,只需使用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);
还有其他方法可以把它写得更短更干净吗?