在 vb.net 中的另一个位置创建文件
create file to another location in vb.net
我通过 VSTO 为 MS Word 创建了一个插件 VB.NET
我编写了将两个文件从 Resources 复制到 AppData 文件夹的函数。
该代码工作正常并复制文件,但在 MyDocumnet 和我的文档文件位置创建附加文件(文件大小为 0)。
我该如何解决?
Public Function openFile(fName As String) As String
Dim path, fileName As String
Dim bytes, p
' Dim FileLocked As Boolean
p = Environment.GetEnvironmentVariable("APPDATA") & "\"
Select Case fName
Case "q"
bytes = My.Resources.qText
fileName = "qText.docx"
path = p & fileName
Case "t"
bytes = My.Resources.tText
fileName = "tText.docx"
path = p & fileName
End Select
Dim Locked As Boolean = False
Try
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
fs.Close()
Catch
Locked = True
End Try
Try
If Locked Then
Return fileName
Else
File.WriteAllBytes(path, bytes)
If fileName = "QText.docx" Then
SourceApp.Documents.Open(FileName:=path, ReadOnly:=True, Visible:=False)
Else
SourceApp.Documents.Open(FileName:=path, Visible:=False)
SourceApp.Documents("tText.docx").Content.Delete()
End If
SourceApp.ScreenUpdating = False
SourceApp.DisplayStatusBar = False
Call ComMode()
Return fileName
End If
Catch ex As Exception
End Try
End Function
不应该这样:
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
实际上是这样的:
Dim fs As FileStream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
就目前而言,您只指定了文件名而不是文件路径,因此文件夹路径必须假定为某个默认路径,这大概是您看到这些文件创建的位置。
这是描述性变量名称为何重要的示例。就个人而言,我会使用 folderPath
、fileName
和 filePath
而不是 p
、fileName
和 path
。那么每一个是什么就更加明显了。
无论如何,创建文件有什么意义?为什么不先检查一个是否存在,然后只在存在时尝试打开它?您似乎在检查文件是否被锁定,但如果文件不存在则显然无法锁定。
当您检查磁盘上的特定文件 exists/locked 时是否使用了相对路径。仅传递文件名,即相对路径:
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
fs.Close()
但是你写内容的时候在代码中指定了绝对路径:
File.WriteAllBytes(path, bytes)
路径可以指向另一个地方。我建议使用 Directory.GetCurrentDirectory method which gets the current working directory of the application. If required you may set the current directory using the Environment.CurrentDirectory 属性 设置当前工作目录的完全限定路径。
我通过 VSTO 为 MS Word 创建了一个插件 VB.NET 我编写了将两个文件从 Resources 复制到 AppData 文件夹的函数。 该代码工作正常并复制文件,但在 MyDocumnet 和我的文档文件位置创建附加文件(文件大小为 0)。 我该如何解决?
Public Function openFile(fName As String) As String
Dim path, fileName As String
Dim bytes, p
' Dim FileLocked As Boolean
p = Environment.GetEnvironmentVariable("APPDATA") & "\"
Select Case fName
Case "q"
bytes = My.Resources.qText
fileName = "qText.docx"
path = p & fileName
Case "t"
bytes = My.Resources.tText
fileName = "tText.docx"
path = p & fileName
End Select
Dim Locked As Boolean = False
Try
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
fs.Close()
Catch
Locked = True
End Try
Try
If Locked Then
Return fileName
Else
File.WriteAllBytes(path, bytes)
If fileName = "QText.docx" Then
SourceApp.Documents.Open(FileName:=path, ReadOnly:=True, Visible:=False)
Else
SourceApp.Documents.Open(FileName:=path, Visible:=False)
SourceApp.Documents("tText.docx").Content.Delete()
End If
SourceApp.ScreenUpdating = False
SourceApp.DisplayStatusBar = False
Call ComMode()
Return fileName
End If
Catch ex As Exception
End Try
End Function
不应该这样:
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
实际上是这样的:
Dim fs As FileStream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
就目前而言,您只指定了文件名而不是文件路径,因此文件夹路径必须假定为某个默认路径,这大概是您看到这些文件创建的位置。
这是描述性变量名称为何重要的示例。就个人而言,我会使用 folderPath
、fileName
和 filePath
而不是 p
、fileName
和 path
。那么每一个是什么就更加明显了。
无论如何,创建文件有什么意义?为什么不先检查一个是否存在,然后只在存在时尝试打开它?您似乎在检查文件是否被锁定,但如果文件不存在则显然无法锁定。
当您检查磁盘上的特定文件 exists/locked 时是否使用了相对路径。仅传递文件名,即相对路径:
Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
fs.Close()
但是你写内容的时候在代码中指定了绝对路径:
File.WriteAllBytes(path, bytes)
路径可以指向另一个地方。我建议使用 Directory.GetCurrentDirectory method which gets the current working directory of the application. If required you may set the current directory using the Environment.CurrentDirectory 属性 设置当前工作目录的完全限定路径。