このメソッドを使用してPath.GetFileNameWithoutExtension
、「abc:file.jpg」から「abc:file」のような文字列からファイル拡張子を削除しましたが、これを行うと
Path.GetFileNameWithoutExtension("abc:file.jpg")
結果は「ファイル」として表示されます。また、「abc:」も削除されました。なぜそれが起こったのですか?この問題を解決するためのより良い方法はありますか?
このメソッドを使用してPath.GetFileNameWithoutExtension
、「abc:file.jpg」から「abc:file」のような文字列からファイル拡張子を削除しましたが、これを行うと
Path.GetFileNameWithoutExtension("abc:file.jpg")
結果は「ファイル」として表示されます。また、「abc:」も削除されました。なぜそれが起こったのですか?この問題を解決するためのより良い方法はありますか?
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
最初に abcfile.jpg や abc_file.jpg のようにファイルに適切な名前を付けることをお勧めします。その後、完全なファイル名を取得できます。
この方法を試してください..
Path.Combine(System.IO.Path.GetDirectoryName(path), System.IO.Path.GetFileNameWithoutExtension(path));