ファイル名 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 まだまだ  (中学生) 投稿日時 2009/4/15 05:03:39
皆さんありがとうございます。

>これがファイル名として成り立たない理由はなんですか?
>一応このファイル名でも成り立ちますよ。
すみません。その通りでした。
パスとは、ドライブ名:¥フォルダ名・・・¥ファイル名.拡張子 というものでした。

> なぜ自分でこの判定を行う必要があるのでしょうか?
ファイルやフォルダをコピーなどするプログラムを作っています。
そのコピー先のパスの点検のためです。

皆さんのおかげで出来そうです。ありがとうございました。
投稿者 るしぇ  (社会人) 投稿日時 2009/4/15 00:34:25
>「CHkjklullk」はファイル名として成り立ちません。
多くのシステムでは、カレントフォルダに「CHkjklullk」
というファイルを作ることで成り立ちそうです。

ファイル名とファイルパスを区別して表現したほうが
よさそうです。

また、相対パス(ピリオドから始まる)場合は成り立つと判断
しますか?成り立たないとしますか?

> しかし、いままでこれで悩んで記憶がないのでこの判定が
> できなくても困らなかったのだと思います。
ファイルオープンダイアログあたりを利用すると、使用できない
文字列は除外されそうですね。
> なぜ自分でこの判定を行う必要があるのでしょうか?
例えば、テキストボックスに任意に入力された文字列を
利用してファイルを保存したいが「CHkjklullk」にそのまま
保存しようとしたらエラーが出たとか。その時のプログラムは
こう書いたとか。その時のエラーメッセージはこうだったとか。
そこが知りたいですね。

> System.IO.PathクラスのGetFullPathメソッドが近いでしょうか?
ボクは GetDirectoryName でディレクトリ部分を抜き出して
Directory.Exists で存在調べて、無ければ Directory.CreateDirectory
GetFileName でファイル名を抜き出して
File.Exists で存在調べて、あれば上書き確認。
パスに無効な文字列が含まれていれば、抜き出す処理の例外処理で
キャッチとかを予想しました。

他にも検索に引っかかったもので
http://www.atmarkit.co.jp/fdotnet/dotnettips/551invalidchars/invalidchars.html
余談
http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01.html
投稿者 るきお  (社会人) 投稿日時 2009/4/14 21:59:44
補足
本文中に半角の¥が打てないので全角で表現しました。
投稿者 るきお  (社会人) 投稿日時 2009/4/14 21:56:39
自作でちゃんとやろうとするとなかなか大変です。
また、ヴァンさんも指摘されていますが、そもそも何を正しいとするかの判断が最初に必要です。

C:¥test¥test.txt
test.txt
.¥test.txt
¥¥mypc¥C¥test¥test.txt
¥¥mypc¥C$¥test¥test.txt
file://c:/test/test/txt
などなど

自作でがんばる場合は葉月さんのサンプルから始められるといいかと思います。

.NET Frameworkでは
System.IO.PathクラスのGetFullPathメソッドが近いでしょうか?
もっとずばりなものはありませんでしたでしょうか?
探せば何かありそうな気がするんですが…。
Windows APIではPathIsUNC関数などがあります。

しかし、いままでこれで悩んで記憶がないのでこの判定ができなくても困らなかったのだと思います。
なぜ自分でこの判定を行う必要があるのでしょうか?

投稿者 ヴァン  (社会人) 投稿日時 2009/4/14 18:48:06
こんにちは

>「CHkjklullk」はファイル名として成り立ちません。

これがファイル名として成り立たない理由はなんですか?
一応このファイル名でも成り立ちますよ。

考えている成り立つ条件を出してください。

1.存在するパスが付いていること。
2.拡張子が○○○であること。
3.文字数が○○であること。

などあると思います。
投稿者 葉月  (社会人) 投稿日時 2009/4/14 10:26:09
私が思いついたやり方だと二つですね。
①StringクラスのIndexOfメソッドを使って、\、:、.が含まれているか確認する。
②正規表現で正確なパスを判断する。

一応サンプルを作りましたが、即興で作ったので不完全です(マテ
正規表現は遅いので、お勧めは①ですね。
細かく制御したい場合は、②の方が適していると考えてください。

>>>①のサンプル
   Dim strPath() As String = {"C:\fail\fair.text""asdfgh"}

   For i As Integer = 0 To strPath.Length - 1
       If strPath(i).IndexOf(":") > -1 And strPath(i).IndexOf("\") > -1 And strPath(i).IndexOf(".") > -1 Then
          Console.WriteLine("パスです。 " & strPath(i))
       Else
          Console.WriteLine("パスではありません。" & strPath(i))
       End If
   Next


>>>②のサンプル
   Dim strPath() As String = {"C:\fail\fair.text""asdfgh"}
   Dim regex As New System.Text.RegularExpressions.Regex("[a-zA-Z]:\.*")

   For i As Integer = 0 To strPath.Length - 1
       If (regex.IsMatch(strPath(i))) Then
           Console.WriteLine("パスです。 " & strPath(i))
       Else
           Console.WriteLine("パスではありません。" & strPath(i))
       End If
   Next
投稿者 まだまだ  (中学生) 投稿日時 2009/4/14 08:59:50
すみません

そういうのではなく、
ファイル名として成り立つのかどうかを判別したいのです。
例えば、「C:/vb/jhs/fl.txt」はファイル名ですが、
「CHkjklullk」はファイル名として成り立ちません。

そういうのが判別できるものです。
よろしくお願いします。
投稿者 葉月  (社会人) 投稿日時 2009/4/14 06:16:38
FileクラスのExistsメソッドで、ファイルパスが存在するか確認できます。
VB中学校には、他にも便利な機能が書いてあります。

第30回:ファイル処理
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard30.htm

>>>サンプルコード
Dim strPath As String = TextBox1.Text

If System.IO.File.Exists(strPath) Then
MessageBox.Show("ファイルが存在します")
Else
MessageBox.Show("ファイルが存在しません")
End If
投稿者 まだまだ  (中学生) 投稿日時 2009/4/14 05:44:13
こんにちは

ファイルを新しく作るとき、新しいパスを指定するとき、
テキストボックスに入力したファイルパスが、使えるものなのかを判別することは可能なのでしょうか?

例えば、C:/fail/fair.textのばあいはtrueを返し、
asdfghやフォルダ名C:/failのときはfalseを返すようなやつです。

何だかわかりにくくてすみません。
どうかよろしくお願いします。