2

好吧,过去几个小时这个人一直在逼我翻墙,我觉得我几乎可以尝到胜利的滋味,但我被困住了。

我正在根据用户提供的要求将文件写入目录,这个特定部分处理Version Number为新文件分配一个新文件。所以基本上,这会使用以下命名约定创建新文件:

Path\FileName_ver1
Path\FileName_ver2

等等。问题是,我无法弄清楚如何确定目录中是否存在具有类似命名(减去_ver#字符串)的文件,然后解析名称以找出当前版本号,然后使用版本号创建新文件并添加1。

如果您查看我当前的代码,目前的问题是当它进入循环时出现,告诉我数组超出范围,即使该文件确实存在于目录中。

Dim strPossibleFilename() As String = Directory.GetFiles(savePath, saveName & "_ver*" & saveExt)
                Dim intVersionNumber As Integer = 1
                For i = 0 To strPossibleFilename.Length - 1
                    If File.Exists(strPossibleFilename(i)) Then
                        Dim fileInfo As New FileInfo(strPossibleFilename(i))
                        Dim fullName As String
                        Dim strVersionNumber As String
                        fullName = fileInfo.FullName

                        Dim versionPosition As Integer = fullName.IndexOf("_ver")
                        Dim dotPosition As Integer = fullName.IndexOf(".")
                        Dim versionCharacterCount As Integer = dotPosition - versionPosition
                        strVersionNumber = fullName.Substring(versionPosition, versionCharacterCount)

                        If intVersionNumber < strVersionNumber Then
                            intVersionNumber = strVersionNumber
                        End If
                    End If
                Next i

                If intVersionNumber > 1 Then
                    saveLocation = savePath & saveName & "_ver" & intVersionNumber + 1 & saveExt
                    fstr = New FileStream(saveLocation, FileMode.CreateNew, FileAccess.ReadWrite)
                    fstr.Write(inBuf, 0, bytesRead)
                Else
                    saveLocation = savePath & saveName & "_ver1" & saveExt
                    fstr = New FileStream(saveLocation, FileMode.CreateNew, FileAccess.ReadWrite)
                    fstr.Write(inBuf, 0, bytesRead)
                End If

PS所有其他功能都有效,就写作和一切而言,我在我的代码中的多个位置执行此操作,包括在文件名已经存在时将其他不同的字符串分配给文件名......如果您需要更多信息,请告诉我信息。

编辑: 根据给出的答案进行了一些更改,现在它正在查找文件,但这带来了一个新问题......所以我无法弄清楚如何只获取“_ver”之后的数字来分配那个到 intVersionNumber.. 有什么想法吗?

编辑2: 好的,为了解决这个问题,我补充说:

Dim strVersionString As String

并添加了一些其他的东西,所以现在 for 循环看起来像这样:

For i = 0 To strPossibleFilename.Length - 1
                    If File.Exists(strPossibleFilename(i)) Then
                        Dim fileInfo As New FileInfo(strPossibleFilename(i))
                        Dim fullName As String
                        Dim strVersionString As String
                        Dim strVersionNumber As String
                        fullName = fileInfo.FullName

                        Dim versionPosition As Integer = fullName.IndexOf("_ver")
                        Dim dotPosition As Integer = fullName.IndexOf(".")
                        Dim versionCharacterCount As Integer = dotPosition - versionPosition
                        strVersionString = fullName.Substring(versionPosition, versionCharacterCount)
                        Dim rPosition As Integer = strVersionString.IndexOf("r") + 1

                        strVersionNumber = strVersionString.Substring(rPosition, strVersionString.Length - rPosition)

                        If intVersionNumber < strVersionNumber Then
                            intVersionNumber = strVersionNumber
                        End If
                    End If
                Next i

现在它正在工作:D 感谢您的所有帮助!

4

2 回答 2

1

你做得对,我对这条线有一个偷偷摸摸的怀疑

For i = 0 To strPossibleFilename.Length 

将其更改为

For i = 0 To strPossibleFilename.Length -1

然后除非你吻了比尔盖茨的女儿而他很生气,否则它应该有效!

于 2013-05-31T17:38:58.670 回答
1

对于您问题的第二部分,如何获取后面的数字_ver

' consider padding the version number
' with leading zeros
' and using a second underscore
' to make it easier to parse for number
Dim fileName As String = "filename_ver_001"
Dim parts As String() = fileName.Split("_"c)
Dim verNumber As Integer = Integer.Parse(parts(2))

如果添加第二个下划线,则可以使用 String.Split 将文件名拆分为数组。

FWIW,如果您想要一个更可排序的文件列表,请用前导零填充数字。否则 filename_ver11 在 filename_ver2 之前排序

于 2013-05-31T18:54:58.017 回答