3

このメソッドを使用してPath.GetFileNameWithoutExtension、「abc:file.jpg」から「abc:file」のような文字列からファイル拡張子を削除しましたが、これを行うと

Path.GetFileNameWithoutExtension("abc:file.jpg") 

結果は「ファイル」として表示されます。また、「abc:」も削除されました。なぜそれが起こったのですか?この問題を解決するためのより良い方法はありますか?

4

3 に答える 3

4

char ":" (コロン) は、ファイル名の一部として使用できません。ファイル名のみを要求すると、それとそれより前のすべてが削除されるため、パス区切りとして解釈されます。

ファイル名が有効かどうかを確認する方法の 1 つを次に示します。

この関数は、有効なファイル名に対して true を返し、無効なファイルに対して false を返します。

private bool IsValidFilename(string filename)
{
    //
    //-- Get array with invalid chars for filenames
    //
    char[] illegalChars = Path.GetInvalidFileNameChars;
    //
    //-- Go through each char in filename and check if the char is
    //   in our array of invalid chars
    //
    foreach (char c in filename) {
        if (illegalChars.Contains(c))
            return false;
    }
    //
    //-- All are valid, return true
    //
    return true;

}

上記の関数が false を返す場合は、次の関数を使用してファイル名をフォーマットし、不正な文字を削除できます (この IIRC を実行するための os 関数が存在しますが、手動で実行するのは簡単です)。

private string MakeFilenameValid(string filename, char replacment)
{
    //
    //-- Get array with invalid chars for filenames
    //
    char[] illegalChars = Path.GetInvalidFileNameChars;
    StringBuilder validFilename = new StringBuilder();
    //
    //-- Go through each char in filename and check if the char is
    //   in our array of invalid chars. If it is, replace it
    //
    foreach (char c in filename) {
        if (illegalChars.Contains(c)) {
            validFilename.Append(replacment);
        } else {
            validFilename.Append(c);
        }
    }
    //
    //-- Return filename
    //
    return validFilename.ToString;

}

使用例:

private void Button1_Click(System.Object sender, System.EventArgs e)
{
    string filename = "abc:file.jpg";

    if (!IsValidFilename(filename)) {
        filename = MakeFilenameValid(filename, "_");
    }

    MessageBox.Show(filename);

}

VB では:

Private Sub Button1_Click(sender As System.Object, _
                          e As System.EventArgs) Handles Button1.Click

    Dim filename As String = "abc:file.jpg"

    If Not IsValidFilename(filename) Then
        filename = MakeFilenameValid(filename, "_")
    End If

    MessageBox.Show(filename)

End Sub
Private Function IsValidFilename(filename As String) As Boolean
    '
    '-- Get array with invalid chars for filenames
    '
    Dim illegalChars() As Char = Path.GetInvalidFileNameChars
    '
    '-- Go through each char in filename and check if the char is
    '   in our array of invalid chars
    '
    For Each c As Char In filename
        If illegalChars.Contains(c) Then Return False
    Next
    '
    '-- All are valid, return true
    '
    Return True

End Function
Private Function MakeFilenameValid(filename As String, replacment As Char) As String
    '
    '-- Get array with invalid chars for filenames
    '
    Dim illegalChars() As Char = Path.GetInvalidFileNameChars
    Dim validFilename As New StringBuilder
    '
    '-- Go through each char in filename and check if the char is
    '   in our array of invalid chars. If it is, replace it
    '
    For Each c As Char In filename
        If illegalChars.Contains(c) Then
            validFilename.Append(replacment)
        Else
            validFilename.Append(c)
        End If
    Next
    '
    '-- Return filename
    '
    Return validFilename.ToString

End Function
于 2012-12-19T06:16:55.743 に答える
0

最初に abcfile.jpg や abc_file.jpg のようにファイルに適切な名前を付けることをお勧めします。その後、完全なファイル名を取得できます。

于 2012-12-19T06:18:52.460 に答える
0

この方法を試してください..

Path.Combine(System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileNameWithoutExtension(path));
于 2012-12-19T06:26:38.467 に答える