1,?とか*とかの文字
- < (less than)
- > (greater than)
- : (colon)
- ” (double quote)
- / (forward slash)
- \ (backslash)
- | (vertical bar or pipe)
- ? (question mark)
- * (asterisk)
2,制御文字
文字コード0から31までの制御文字
3,デバイス名っぽい文字列
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
拡張子をのぞいた部分がこうなる場合もやめたほうがいいらしい。
4,ピリオドやスペースで終わる文字列
ファイルシステム的には許されるかもしれないが、シェル的にはダメらしい。
C#で文字列がファイル名として使えるかを調べるコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
public static bool IsFileNamable(string fn) { if (string.IsNullOrEmpty(fn)) return false; if(fn.EndsWith(".") || fn.EndsWith(" ")) return false; foreach (char c in fn) { if (c == '<' || c == '>' || c == ':' || c == '\"' || c == '/' || c == '\\' || c == '|' || c == '?' || c == '*') { return false; } if (0 <= c && c <= 31) { return false; } } string lfn = fn.ToUpper(); int lp = lfn.LastIndexOf('.'); if (lp != -1) { lfn = lfn.Substring(0, lp); } if ( lfn == "CON" || lfn == "PRN" || lfn == "AUX" || lfn == "NUL" || lfn == "COM1" || lfn == "COM2" || lfn == "COM3" || lfn == "COM4" || lfn == "COM5" || lfn == "COM6" || lfn == "COM7" || lfn == "COM8" || lfn == "COM9" || lfn == "LPT1" || lfn == "LPT2" || lfn == "LPT3" || lfn == "LPT4" || lfn == "LPT5" || lfn == "LPT6" || lfn == "LPT7" || lfn == "LPT8" || lfn == "LPT9" ) { return false; } return true; } |