按目录 .Net 中的文件数量递增文件名编号
Increment filename-number by the amount of files in directory .Net
我的程序查找并列出位于远程文件夹中的所有文件。
同一程序能够将创建的新文件保存到同一文件夹中。
我可以决定文件名,但我需要程序为每个文件提供某种 "ID"。
我希望程序能够随时统计文件夹中的文件数量,并将正在保存的文件命名为行中的下一个数字。
你看,文件夹里有10个文件。然后我使用 New_Case 事件创建一个新的。我写了一堆信息,最后点击了 Save_Case 事件。
我希望程序将文件命名为 "Somename11"
然后,由于它现在在文件夹中有 11 个文件,我也这样做并创建一个新案例 - 一堆信息 - 并保存,下一个文件将被称为 "Someothername12".
我还没有找到任何有效的例子,但我发现很多如果文件名已经存在于文件夹中,数字会增加。
不管怎样,我都需要增加数字。
我试过使用每次递增的计数器,但由于该程序将同时被多个用户使用,我需要避免两个用户递增相同的数字。
所以我相信通过增加文件夹中的文件数量会更好。
如果它有助于确定这一点,我无法使用
My.Computer.FileSystem.GetFiles
因为它是远程的,而且只想搜索我的电脑。
我正在使用 WinSCP .NET 将 SFTP 连接到服务器。
这不是世界上最有效的方法,但它是实现既定目标的简单方法:
Public Function SaveWithUniqueFileName(desiredFilePath As String, contents() As Byte) As String
Dim uniqueFilePath As String = Nothing
Dim suceeded As Boolean = False
For i As Integer = 1 To Integer.MaxValue
If i = 1 Then
uniqueFilePath = desiredFilePath
Else
Dim uniqueFileName As String = Path.GetFileNameWithoutExtension(desiredFilePath) & i.ToString() & Path.GetExtension(desiredFilePath)
uniqueFilePath = Path.Combine(Path.GetDirectoryName(desiredFilePath), uniqueFileName)
End If
If Not File.Exists(uniqueFilePath) Then
Try
Using stream As New FileStream(uniqueFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None)
stream.Write(contents, 0, contents.Length)
End Using
suceeded = True
Exit For
Catch ex As IOException
End Try
End If
Next
If Not suceeded Then
uniqueFilePath = Nothing
End If
Return uniqueFilePath
End Function
如果文件名不存在,该方法将保存到所需的文件名,或者如果文件名已经存在,则将唯一编号附加到文件名。例如,如果你这样称呼它:
Dim data() As Byte = {72, 101, 108, 108, 111}
Dim savedToPath As String = SaveWithUniqueFileName("C:\Test.txt", data)
If savedToPath IsNot Nothing Then
Console.WriteLine("Successfully saved to " & savedToPath)
Else
Console.WriteLine("Failed to save")
End If
还有很多地方需要改进。它应该对它的计数有一些上限,并且它应该比仅仅吃掉它并返回 null 更好地处理异常(理想情况下,使用代码会知道它失败的原因)。此外,它从 1 开始遍历所有同名文件,因此同名文件越多,速度越慢。如果性能有问题,您可以通过某种方式同步所有客户端,这样它们就不会同时尝试保存。这可能就像在同一文件夹中锁定单个标志文件一样简单,也可能涉及 client/server 安排,其中所有客户端将请求发送到单个服务器,该服务器以有序的串行方式处理保存。无论哪种方式,这个简单的例子都是一个很好的起点。
我的程序查找并列出位于远程文件夹中的所有文件。 同一程序能够将创建的新文件保存到同一文件夹中。 我可以决定文件名,但我需要程序为每个文件提供某种 "ID"。 我希望程序能够随时统计文件夹中的文件数量,并将正在保存的文件命名为行中的下一个数字。
你看,文件夹里有10个文件。然后我使用 New_Case 事件创建一个新的。我写了一堆信息,最后点击了 Save_Case 事件。 我希望程序将文件命名为 "Somename11"
然后,由于它现在在文件夹中有 11 个文件,我也这样做并创建一个新案例 - 一堆信息 - 并保存,下一个文件将被称为 "Someothername12".
我还没有找到任何有效的例子,但我发现很多如果文件名已经存在于文件夹中,数字会增加。 不管怎样,我都需要增加数字。
我试过使用每次递增的计数器,但由于该程序将同时被多个用户使用,我需要避免两个用户递增相同的数字。
所以我相信通过增加文件夹中的文件数量会更好。
如果它有助于确定这一点,我无法使用
My.Computer.FileSystem.GetFiles
因为它是远程的,而且只想搜索我的电脑。
我正在使用 WinSCP .NET 将 SFTP 连接到服务器。
这不是世界上最有效的方法,但它是实现既定目标的简单方法:
Public Function SaveWithUniqueFileName(desiredFilePath As String, contents() As Byte) As String
Dim uniqueFilePath As String = Nothing
Dim suceeded As Boolean = False
For i As Integer = 1 To Integer.MaxValue
If i = 1 Then
uniqueFilePath = desiredFilePath
Else
Dim uniqueFileName As String = Path.GetFileNameWithoutExtension(desiredFilePath) & i.ToString() & Path.GetExtension(desiredFilePath)
uniqueFilePath = Path.Combine(Path.GetDirectoryName(desiredFilePath), uniqueFileName)
End If
If Not File.Exists(uniqueFilePath) Then
Try
Using stream As New FileStream(uniqueFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None)
stream.Write(contents, 0, contents.Length)
End Using
suceeded = True
Exit For
Catch ex As IOException
End Try
End If
Next
If Not suceeded Then
uniqueFilePath = Nothing
End If
Return uniqueFilePath
End Function
如果文件名不存在,该方法将保存到所需的文件名,或者如果文件名已经存在,则将唯一编号附加到文件名。例如,如果你这样称呼它:
Dim data() As Byte = {72, 101, 108, 108, 111}
Dim savedToPath As String = SaveWithUniqueFileName("C:\Test.txt", data)
If savedToPath IsNot Nothing Then
Console.WriteLine("Successfully saved to " & savedToPath)
Else
Console.WriteLine("Failed to save")
End If
还有很多地方需要改进。它应该对它的计数有一些上限,并且它应该比仅仅吃掉它并返回 null 更好地处理异常(理想情况下,使用代码会知道它失败的原因)。此外,它从 1 开始遍历所有同名文件,因此同名文件越多,速度越慢。如果性能有问题,您可以通过某种方式同步所有客户端,这样它们就不会同时尝试保存。这可能就像在同一文件夹中锁定单个标志文件一样简单,也可能涉及 client/server 安排,其中所有客户端将请求发送到单个服务器,该服务器以有序的串行方式处理保存。无论哪种方式,这个简单的例子都是一个很好的起点。