Vb.net 如何设置文件名的最大字符长度?

Vb.net 如何设置文件名的最大字符长度?,vb.net,Vb.net,我目前正在使用以下代码从我定义的目录中的任何文件名中删除定义的特殊字符和空格: For Each file As FileInfo In files newName = Regex.Replace(file.Name, "[!@#$%^&*()_ ]", "") If (file.Name <> newName) Then newPath = Path.Combine(dir, n

我目前正在使用以下代码从我定义的目录中的任何文件名中删除定义的特殊字符和空格:

        For Each file As FileInfo In files
            newName = Regex.Replace(file.Name, "[!@#$%^&*()_ ]", "")
            If (file.Name <> newName) Then
                newPath = Path.Combine(dir, newName)
                file.CopyTo(newPath)
            End If
        Next
编辑:如何将新文件名newName的字符修剪为除前26个字符以外的所有字符

答复:

For Each file As FileInfo In files
            If (file.Name.Length >= 36) Then
                Dim maxLen As Integer = 26 - file.Extension.Length
                newName = ${Regex.Replace(Path.GetFileNameWithoutExtension(file.Name), "[!@#$%^&*()_ ]",
                                    "").Substring(0, maxLen)}{file.Extension}"
                newPath = Path.Combine(dir, newName)
                file.CopyTo(newPath, True)
            ElseIf (file.Name.Length < 36) Then
                newName = Regex.Replace(file.Name, "[!@#$%^&*()_ ]", "")
                If (file.Name <> newName) Then
                    newPath = Path.Combine(dir, newName)
                    file.CopyTo(newPath)
                End If
            End If
        Next
使用

注意:字符串长度应大于或等于26

编辑: 如果你想保留分机。改用这个:

newName = newName.Remove(26, newName.length - 30)
使用

注意:字符串长度应大于或等于26

编辑: 如果你想保留分机。改用这个:

newName = newName.Remove(26, newName.length - 30)

如果您询问如何获取字符串的子集,您将得到。如果您想要前26个字符,它将是第二个重载

例如:

Dim filename As String = "this is a terrible f^ln@me! that is (way) too long.txt"
Dim newFilename As String = Regex.Replace(filename, "[!@#$%^&*()_ ]", String.Empty).Substring(0, 26)
现场演示:

更新

根据您的评论,以下是您如何在不使用扩展名的情况下精简文件名:

Dim filename As String = "this is a terrible f^ln@me! that is (way) too long.txt"
Dim extension As String = Path.GetExtension(filename)
Dim shortFilename As String = Path.GetFileNameWithoutExtension(filename)
Dim newFilename As String = Regex.Replace(shortFilename, "[!@#$%^&*()_ ]", String.Empty).Substring(0, 26) & extension

实时演示:

如果您询问如何获取字符串的子集,您将获得。如果您想要前26个字符,它将是第二个重载

例如:

Dim filename As String = "this is a terrible f^ln@me! that is (way) too long.txt"
Dim newFilename As String = Regex.Replace(filename, "[!@#$%^&*()_ ]", String.Empty).Substring(0, 26)
现场演示:

更新

根据您的评论,以下是您如何在不使用扩展名的情况下精简文件名:

Dim filename As String = "this is a terrible f^ln@me! that is (way) too long.txt"
Dim extension As String = Path.GetExtension(filename)
Dim shortFilename As String = Path.GetFileNameWithoutExtension(filename)
Dim newFilename As String = Regex.Replace(shortFilename, "[!@#$%^&*()_ ]", String.Empty).Substring(0, 26) & extension

实时演示:

要重命名文件,可以使用.MoveTo方法。 从文档中:

将指定的文件移动到新位置,并提供 指定新文件名

您可能只想重命名名称部分,以便扩展名保持不变。 这种方法将支持任何文件扩展名,而不仅仅是3个字符的扩展名

For Each file As FileInfo In files
    Dim newName As String = Path.GetFileNameWithoutExtension(file.Name).Remove(26)

    Dim newPath = Path.Combine(file.DirectoryName, $"{newName}{file.Extension}")
    file.MoveTo(newPath)
Next

要重命名文件,可以使用.MoveTo方法。 从文档中:

将指定的文件移动到新位置,并提供 指定新文件名

您可能只想重命名名称部分,以便扩展名保持不变。 这种方法将支持任何文件扩展名,而不仅仅是3个字符的扩展名

For Each file As FileInfo In files
    Dim newName As String = Path.GetFileNameWithoutExtension(file.Name).Remove(26)

    Dim newPath = Path.Combine(file.DirectoryName, $"{newName}{file.Extension}")
    file.MoveTo(newPath)
Next

您可以按如下方式使用Linq:

Dim dir=c:\myFolder Dim except=[!@$%^&*.].ToArray 将每个文件作为文件中的文件信息 Dim maxLen As Integer=26-file.Extension.Length Dim newPath=Path.Combinedir, ${New StringPath.GetFileName WithOutExtensionFile.Name。 托克拉里。 例外。 塔克马克斯伦。 ToArray}{file.Extension} file.CopyTonewPath,True 下一个 假设您有一个名为的文件:

abcdefg_hijk!lm@pno#pq%r(stuvy)x$z.dbf
n_BrucesMiddle NH 12 34 5 W3_H.dbf
newPath输出将是:

c:\myFolder\abcdefghijklmpnoqrstuv.dbf
如果这是你需要做的

编辑:

使用正则表达式的替代方法:

Dim except=[!@$%^&*.] 将每个文件作为文件中的文件信息 Dim maxLen As Integer=26-file.Extension.Length Dim newName=${Regex.ReplacePath.GetFileNameWithoutExtensionfile.Name, 除了 .Substring0,maxLen}{file.Extension} Dim newPath=Path.Combinedir,newName file.CopyTonewPath,True 下一个 因此,名称为的文件的新路径:

abcdefg_hijk!lm@pno#pq%r(stuvy)x$z.dbf
n_BrucesMiddle NH 12 34 5 W3_H.dbf
。。。将是:

c:\myFolder\nBrucesMiddleNH12345W3.dbf
不需要的字符已被删除,新文件名newName(包括扩展名)的最大长度为26

下面是一个例子


再说一次,如果你需要的话。祝您好运。

您可以按如下方式使用Linq:

Dim dir=c:\myFolder Dim except=[!@$%^&*.].ToArray 将每个文件作为文件中的文件信息 Dim maxLen As Integer=26-file.Extension.Length Dim newPath=Path.Combinedir, ${New StringPath.GetFileName WithOutExtensionFile.Name。 托克拉里。 例外。 塔克马克斯伦。 ToArray}{file.Extension} file.CopyTonewPath,True 下一个 假设您有一个名为的文件:

abcdefg_hijk!lm@pno#pq%r(stuvy)x$z.dbf
n_BrucesMiddle NH 12 34 5 W3_H.dbf
newPath输出将是:

c:\myFolder\abcdefghijklmpnoqrstuv.dbf
如果这是你需要做的

编辑:

使用正则表达式的替代方法:

Dim except=[!@$%^&*.] 将每个文件作为文件中的文件信息 Dim maxLen As Integer=26-file.Extension.Length Dim newName=${Regex.ReplacePath.GetFileNameWithoutExtensionfile.Name, 除了 .Substring0,maxLen}{file.Extension} Dim newPath=Path.Combinedir,newName file.CopyTonewPath,True 下一个 因此,名称为的文件的新路径:

abcdefg_hijk!lm@pno#pq%r(stuvy)x$z.dbf
n_BrucesMiddle NH 12 34 5 W3_H.dbf
。。。将是:

c:\myFolder\nBrucesMiddleNH12345W3.dbf
不需要的字符已被删除,新文件名newName(包括扩展名)的最大长度为26

下面是一个例子


再说一次,如果你需要的话。祝你好运。

你到底在问什么?文件名是一个字符串。您是否在询问如何从字符串中删除除前26个字符以外的所有字符?由你来分析你的问题,并确定你面临的具体问题。您所问的问题实际上比您想象的要广泛得多。您可以使用If-Else语句提示用户,也可以只修剪字符串。这取决于你想要什么。对于我最初的问题过于宽泛或含糊,我深表歉意。我
我已经编辑过了,但是是的,除了新名字的前26个字符外,我想删掉所有字符。你到底在问什么?文件名是一个字符串。您是否在询问如何从字符串中删除除前26个字符以外的所有字符?由你来分析你的问题,并确定你面临的具体问题。您所问的问题实际上比您想象的要广泛得多。您可以使用If-Else语句提示用户,也可以只修剪字符串。这取决于你想要什么。对于我最初的问题过于宽泛或含糊,我深表歉意。我已经编辑过了,但是是的,我想删掉新名字的前26个字符。有没有办法从子字符串计数中排除扩展名?例如,abcdefghijklmpnopqrstuvyxz.dbf的长度为30个字符,但调用子字符串0、26将删除扩展名,文件.copy将失败。在修剪字符串之前,您需要将字符串转换为路径。一旦你有了路径,你就可以得到扩展名,把字符串缩减到26个字符,然后把扩展名追加回去。有没有办法把扩展名从子字符串计数中排除?例如,abcdefghijklmpnopqrstuvyxz.dbf的长度为30个字符,但调用子字符串0、26将删除扩展名,文件.copy将失败。在修剪字符串之前,您需要将字符串转换为路径。一旦你有了路径,你就可以得到扩展名,把字符串缩减到26个字符,然后把扩展名追加回去。有没有办法不把扩展名包括在26个字符的计数中?例如,abcdefghijklmpnopqrstuvyxz.dbf的长度为30个字符,但是调用删除26个字符以外的任何内容都会删除扩展名,并且file.copy会失败。是否有办法不将扩展名包括在26个字符的计数中?例如,abcdefghijklmpnopqrstuvyxz.dbf的长度为30个字符,但是调用以删除26个字符以外的任何内容都会删除扩展名,并且file.copy会失败。谢谢。我试过了,但我注意到它改变了文件名,不仅仅是我需要删除的字符/空格。示例:n_Brucesmidel NH 12 34 5 W3_H成为NBR的SMIDLNH1234W?为什么会这样我对这一点很陌生,也许我的问题措辞不好,但实际上,除了删除特殊字符和空格外,我真的需要将任何不包括扩展名的文件名缩短到最多26个字符。只要文件名的结尾超过了,就可以删除。否则,如果文件名较短,则不需要更改。谢谢。我试过了,但我注意到它改变了文件名,不仅仅是我需要删除的字符/空格。示例:n_Brucesmidel NH 12 34 5 W3_H成为NBR的SMIDLNH1234W?为什么会这样我对这一点很陌生,也许我的问题措辞不好,但实际上,除了删除特殊字符和空格外,我真的需要将任何不包括扩展名的文件名缩短到最多26个字符。只要文件名的结尾超过了,就可以删除。否则,如果文件名较短,则不需要更改。