在vb.net中将文件创建到另一个位置

在vb.net中将文件创建到另一个位置,vb.net,ms-word,vsto,Vb.net,Ms Word,Vsto,我通过VSTO VB.NET为MS Word创建了一个插件 我编写了将两个文件从参考资料复制到AppData文件夹的函数。 代码可以很好地复制文件,但是可以在MyDocumnet和MyDoc文件位置创建其他文件(文件大小为0)。 我怎样才能修好它 Public Function openFile(fName As String) As String Dim path, fileName As String Dim bytes, p ' Dim FileLocked As

我通过VSTO VB.NET为MS Word创建了一个插件 我编写了将两个文件从参考资料复制到AppData文件夹的函数。 代码可以很好地复制文件,但是可以在MyDocumnet和MyDoc文件位置创建其他文件(文件大小为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(文件名,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)
实际上是这样的:

Dim fs As FileStream=File.Open(路径,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)
目前,您只指定了一个文件名而不是一个文件路径,因此必须假定文件夹路径是某种默认路径,这大概就是您看到这些文件创建的地方

这就是为什么描述性变量名很重要的一个例子。就个人而言,我会使用
folderPath
fileName
filePath
而不是
p
fileName
path
。那就更明显了

创建一个文件到底有什么意义?为什么不先检查一个是否存在,然后只在它存在时才尝试打开它?您似乎正在检查文件是否已锁定,但如果文件不存在,则显然无法锁定它。

这不应该:

Dim fs As FileStream=File.Open(文件名,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)
实际上是这样的:

Dim fs As FileStream=File.Open(路径,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)
目前,您只指定了一个文件名而不是一个文件路径,因此必须假定文件夹路径是某种默认路径,这大概就是您看到这些文件创建的地方

这就是为什么描述性变量名很重要的一个例子。就个人而言,我会使用
folderPath
fileName
filePath
而不是
p
fileName
path
。那就更明显了


创建一个文件到底有什么意义?为什么不先检查一个是否存在,然后只在它存在时才尝试打开它?您似乎正在检查文件是否已锁定,但如果文件不存在,则显然无法锁定。

当您检查磁盘上是否存在/锁定特定文件时,会使用相对路径。仅传递文件名,即相对路径:

Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
        fs.Close()
但是,在编写内容时,绝对路径在代码中指定:

File.WriteAllBytes(path, bytes)

路径可以指向另一个地方。我建议使用获取应用程序当前工作目录的方法。如果需要,您可以使用属性设置当前工作目录的完全限定路径来设置当前目录。

当您检查磁盘上是否存在/锁定特定文件时,将使用相对路径。仅传递文件名,即相对路径:

Dim fs As FileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
        fs.Close()
但是,在编写内容时,绝对路径在代码中指定:

File.WriteAllBytes(path, bytes)

路径可以指向另一个地方。我建议使用获取应用程序当前工作目录的方法。如果需要,您可以使用属性设置当前工作目录的完全限定路径来设置当前目录。

@EugeneAstafiev,再看一看
fileName
仅包含文件名,而不包含完整路径,因此:
如果fileName=“QText.docx”则
。正确。应该使用
路径
。@EugeneAstafiev,再看一眼
fileName
仅包含文件名,而不包含完整路径,因此:
如果fileName=“QText.docx”则
。正确。应该使用
路径
。还值得注意的是,您将
文件名
设置为
“qText.docx”
,然后将其与
“qText.docx”
进行比较。这两个值永远不会匹配。还值得注意的是,您将
fileName
设置为
“qText.docx”
,然后将其与
“qText.docx”
进行比较。这两个值永远不会匹配。