C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: ファイル保存時、初期ディレクトリと無効なファイル名の共存


(過去ログ 15 を表示中)

[トピック内 22 記事 (1 - 20 表示)]  << 0 | 1 >>

■4996 / inTopicNo.1)  ファイル保存時、初期ディレクトリと無効なファイル名の共存
  
□投稿者/ シャノン (189回)-(2007/07/02(Mon) 11:22:40)

分類:[.NET 全般] 

2007/07/02(Mon) 11:23:27 編集(投稿者)

C# + .Net Fx 1.1 で WinForms アプリを作ってます。

DBに入っているデータをCSVに保存したいのですが、その際、ファイル保存ダイアログに表示しておくデフォルトのファイル名も、DBから取得する必要があります。
しかし、DBに、ファイル名に使えない文字が入っていると、ダイアログを開く際に例外が発生して落ちてしまいます(例:SaveFileDialog.FileName = "ほげほげ(2007/07/02)";)。
これは、SaveFileDialog の ValidateNames を false にすれば落ちなくなりました。
そのままファイル名を変更せずに保存しようとするとエラーメッセージが出て保存できないのは構いません。

これに加えて、ファイル保存ダイアログの初期表示ディレクトリを、前回保存したディレクトリにしたいという要望があります。
しかし、SaveFileDialog.InitialDirectory を指定すると、ファイル名が切れてしまいます(上記の例なら、"ほげほげ(2007/06/" までがディレクトリと認識され、ダイアログに表示されているのは "02)" のみとなります)。

これを、前回の保存先ディレクトリを維持しつつ、ファイル名は無効なものでもとりあえず表示するようにするには、どうすればよいでしょうか?
DB に登録する段階で、ファイル名として使えない無効な文字をDBに入れさせないというのはやりたくありません(ファイル名専用の列ではありませんので)


どうかご教示願います。
引用返信 編集キー/
■4997 / inTopicNo.2)  Re[1]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ まどか (313回)-(2007/07/02(Mon) 11:40:29)
> しかし、SaveFileDialog.InitialDirectory を指定すると、ファイル名が切れてしまいます(上記の例なら、"ほげほげ(2007/06/" までがディレクトリと認識され、ダイアログに表示されているのは "02)" のみとなります)。

IO.Path.GetDirectoryNameも同様の挙動ですね。

String.LastIndexOf("\")で自力に求めるしかないのかな。

引用返信 編集キー/
■4998 / inTopicNo.3)  Re[1]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ とっちゃん (159回)-(2007/07/02(Mon) 12:28:48)
とっちゃん さんの Web サイト
No4996 (シャノン さん) に返信

ファイルダイアログに渡す前に、名前候補(なんですよね?)を加工するしかないと思います。

<>や、!?"/*+ というあたりは、ファイルシステム的にNG(もちろん、各種ASCIIコードのみ)ですし、
PRN や NUL などデバイス予約語なんかもありますので、そのあたりもブロックの必要はあるかも...ですが

どこかに資料はあった気はするんですが、もしかしたらなくなっちゃってるかなぁ?
PRN & NUL で探すと何か出てくるかも...<探してないです

引用返信 編集キー/
■4999 / inTopicNo.4)  Re[2]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ぽぴ王子 (230回)-(2007/07/02(Mon) 12:44:06)
ぽぴ王子 さんの Web サイト
No4998 (とっちゃん さん) に返信

>>予約デバイス名
CON
PRN
NUL
AUX
LPT1〜9?
COM1〜9?
あたりが有名ですかね。
厳密な資料は結局見つからなかったので、覚えてるやつで。
# 懐かしのCONCON問題とか。
引用返信 編集キー/
■5000 / inTopicNo.5)  Re[1]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ シャノン (190回)-(2007/07/02(Mon) 13:01:36)
No4996 (シャノン さん) に返信
レスありがとうございます。

やっぱり、事前にチェックして _(アンダースコア)とかに置き換える方法になるでしょうか。
仮に要望通りのことができたとしても、"ほげほげ(2007/07/02).csv" って入力したとき、"ほげほげ(2007/07" っていうフォルダがあれば、その中に "02).csv" っていうファイル名で保存されてしまって、それはユーザの望むところではない気がします。

# Path.InvalidPathChars が信用できる結果を返してくれればなぁ…orz
解決済み
引用返信 編集キー/
■5001 / inTopicNo.6)  Re[3]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ まどか (314回)-(2007/07/02(Mon) 13:11:28)
IO.Path.InvalidPathCharsを総当りでIO.Path.DirectorySeparatorChar以外の文字に変換
それをIO.Path.GetDirectoryNameとか

IO.Path.GetDirectoryName("c:\abc\CON:CON:")は大丈夫のようです。
#"\","/"しか見てないんでしょうね。

引用返信 編集キー/
■5002 / inTopicNo.7)  Re[2]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ まどか (315回)-(2007/07/02(Mon) 13:16:14)
> # Path.InvalidPathChars が信用できる結果を返してくれればなぁ…orz

あっちゃぁ、"\"や"/"が含まれてますね。

だめだ。どこまで何かがわからない。。。
引用返信 編集キー/
■5003 / inTopicNo.8)  Re[3]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (42回)-(2007/07/02(Mon) 13:24:02)
ちゃっぴ さんの Web サイト
> 厳密な資料は結局見つからなかったので、覚えてるやつで。

http://blogs.wankuma.com/tyappi/archive/2007/05/16/77042.aspx
引用返信 編集キー/
■5006 / inTopicNo.9)  Re[2]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ 渋木宏明(ひどり) (259回)-(2007/07/02(Mon) 14:33:28)
渋木宏明(ひどり) さんの Web サイト
> # Path.InvalidPathChars が信用できる結果を返してくれればなぁ…orz

使用可能(不可能)文字はファイルシステムの種別によっても微妙に異なるし、シェルもまた独自の制限を課してるのでややこしいです。

シェルの制限がイチバン厳しいので、それにあわせるのがまぁ妥当かな。

Shell 系の API にチェックに使えそうなものがあったようんが気がするけど、この手のやつは「試してみて駄目だったらユーザに選択させる」方向が、表示名と実ファイル名を分離してアプリで管理する方向に逃げるので忘れてしまった (^^;

引用返信 編集キー/
■5007 / inTopicNo.10)  Re[3]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ 渋木宏明(ひどり) (260回)-(2007/07/02(Mon) 14:53:51)
渋木宏明(ひどり) さんの Web サイト
> あたりが有名ですかね。

あと CLOCK (だっけ?)

> 厳密な資料は結局見つからなかったので、覚えてるやつで。

デバイスファイル名ってドライバが任意に登録できるから「よくあるやつ」のチェックだけでいいのかどうか。

引用返信 編集キー/
■5008 / inTopicNo.11)  Re[4]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ 渋木宏明(ひどり) (261回)-(2007/07/02(Mon) 14:58:26)
渋木宏明(ひどり) さんの Web サイト
2007/07/02(Mon) 15:00:06 編集(投稿者)

> IO.Path.GetDirectoryName("c:\abc\CON:CON:")は大丈夫のようです。

いや、使い方によってはまずいかも。

「ファイル名 + ":" + 任意の名前」は「ファイルストリーム(だっけ?)」を扱うための名前規則になっています。

notepad.exe C:\hoge.txt

として適当にテキストを打ち込んで保存、終了

notepad.exe C:\hoge.txt:abc

としてさっきとは異なるテキストを打ち込んで保存、終了

type C:\hoge.txt
type C:\hoge.txt:abc

はそれぞれ異なる内容が出力されます。

そしてもちろん、BCL はファイルストリーム(だっけ?)に対応していません。


引用返信 編集キー/
■5013 / inTopicNo.12)  Re[3]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (43回)-(2007/07/02(Mon) 16:07:26)
ちゃっぴ さんの Web サイト
> ファイルストリーム(だっけ?)

ADS(Alternate Data Streams) とか呼ばれてますね。

http://support.microsoft.com/?scid=kb%3Ben-us%3B105763&x=7&y=18


引用返信 編集キー/
■5024 / inTopicNo.13)  Re[4]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (44回)-(2007/07/03(Tue) 00:00:35)
ちゃっぴ さんの Web サイト
2007/07/03(Tue) 00:01:42 編集(投稿者)

PathCleanupSpec
http://msdn2.microsoft.com/en-us/library/ms647428.aspx

というのがありましたが、device name は弾いてくれないようです。
引用返信 編集キー/
■5037 / inTopicNo.14)  Re[1]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ シャノン (191回)-(2007/07/03(Tue) 11:45:54)
> とっちゃん
LPTx とか COMx は、予約語だから失敗するんですかね。
COM9 とか実際にはなくてもコケますけど。
COM10 以降だと大丈夫なんですが、これ、本当に COM10 がある環境でも問題ないのかな?

> ひどりさん
CLOCK は作れました。
デバイスファイル名って、他にどういうのを言うんでしょう?
Beep とか PHYSICALDRIVE1 とか LCD とかいうファイル名も作れちゃいましたけど、COMx とか CON とか NUL といったもの以外にありうるんでしょうか?
引用返信 編集キー/
■5043 / inTopicNo.15)  Re[2]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ 渋木宏明(ひどり) (262回)-(2007/07/03(Tue) 12:56:41)
渋木宏明(ひどり) さんの Web サイト
> LPTx とか COMx は、予約語だから失敗するんですかね。

あー、そうだったかも。

> COM9 とか実際にはなくてもコケますけど。
> COM10 以降だと大丈夫なんですが、これ、本当に COM10 がある環境でも問題ないのかな?

これもうろ覚えなんで精度悪いですが、COM10 以降はデバイスファイル名としては使えなかったかも。
デバイスを CreateFile() でオープンする時に COM10 では駄目で、\\.\COM10 とかしないと開けなかったはず。

> CLOCK は作れました。

あれ? NT には無いんだったかな?
なんか時計関係のデバイスがあったはずなんですが>DOS

> デバイスファイル名って、他にどういうのを言うんでしょう?

DOS 互換性のための特別なヤツなんですが、全貌は覚えてないんですよね…
DOS 時代に定義されているものだけ気にすればいいはずなので、LPT, PRN, CON, NUL, COM 辺りをカバーすればOKだったと思うんですが…

引用返信 編集キー/
■5085 / inTopicNo.16)  Re[3]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ kkamegawa (3回)-(2007/07/04(Wed) 07:01:05)
kkamegawa さんの Web サイト
じじぃとーくにしかでてこれない...

CLOCKは使えます。使えないのはPC-98x1シリーズで、Windows 3.1のPC-98x1版がtokei.exeでした(PC-AT版はclock.exe)。

>>CLOCK は作れました。
>
> あれ? NT には無いんだったかな?
> なんか時計関係のデバイスがあったはずなんですが>DOS
>
>>デバイスファイル名って、他にどういうのを言うんでしょう?
>
> DOS 互換性のための特別なヤツなんですが、全貌は覚えてないんですよね…
> DOS 時代に定義されているものだけ気にすればいいはずなので、LPT, PRN, CON, NUL, COM 辺りをカバーすればOKだったと思うんですが…

そのくらいだったはず...。
引用返信 編集キー/
■5089 / inTopicNo.17)  Re[4]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (46回)-(2007/07/04(Wed) 10:29:55)
ちゃっぴ さんの Web サイト
NT は CLOCK$

Naming a File
http://msdn2.microsoft.com/en-us/library/aa365247.aspx
引用返信 編集キー/
■5090 / inTopicNo.18)  Re[5]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (47回)-(2007/07/04(Wed) 10:49:29)
ちゃっぴ さんの Web サイト
DDN (DOS Device Name) の検出には QueryDosDevice を利用するものと思われますが、未検証。
引用返信 編集キー/
■5098 / inTopicNo.19)  Re[6]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
□投稿者/ ちゃっぴ (48回)-(2007/07/04(Wed) 12:39:15)
ちゃっぴ さんの Web サイト
No5090 (ちゃっぴ さん) に返信
> DDN (DOS Device Name) の検出には QueryDosDevice を利用するものと思われますが、未検証。

QueryDosDevice ダメだ。
C: とか与えると、それに対応した device name を返すけど、CON とかに反応しない。。。

引用返信 編集キー/
■5130 / inTopicNo.20)  Re[5]: ファイル保存時、初期ディレクトリと無効なファイル名の共存
 
□投稿者/ シャノン (192回)-(2007/07/05(Thu) 11:45:22)
2007/07/05(Thu) 11:45:33 編集(投稿者)

No5089 (ちゃっぴ さん) に返信
> NT は CLOCK$
>
> Naming a File
> http://msdn2.microsoft.com/en-us/library/aa365247.aspx

CLOCK$ 作れちゃいました@XP SP2

で、顧客から「全角にしちゃえばいいじゃん」と言われて、「それでいいならそれで」と手を打つことに。
何か問題があるでしょうか?

# StrConv 使うために C# で Microsoft.VisualBasic を参照するのは激しく気に入らないが、まぁいいか。
解決済み
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -