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

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

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

OpenFileDialogの開ける最大ファイル数、サイズ


(過去ログ 1 を表示中)

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

■161 / inTopicNo.1)  OpenFileDialogの開ける最大ファイル数、サイズ
  
□投稿者/ C#に首ったけ 二等兵(1回)-(2005/02/28(Mon) 17:12:31)

分類:[C#] 


分類:[C#] 

C#のOpenFileDialogで大量のファイルを選択し、開くボタンを
押すと以下の例外が発生します。

at System.Windows.Forms.OpenFileDialog.RunFileDialog(OPENFILENAME_I ofn)
at System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
at System.Windows.Forms.CommonDialog.ShowDialog()

このとき、選択したファイル数に問題があるのか、ファイルサイズに
問題があるのか、いろいろ調べているのですが、見当たらず、ご存知
の方おりましたら、ご教授願います。

また、原因となっている値(ファイル数?バイト?)の上限値変更
等は不可能でしょうか?

0
引用返信 編集キー/
■162 / inTopicNo.2)  Re[1]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ Moo 二等兵(2回)-(2005/02/28(Mon) 17:54:11)
Moo さんの Web サイト

分類:[C#] 

No161に返信(C#に首ったけさんの記事)
> C#のOpenFileDialogで大量のファイルを選択し、開くボタンを
> 押すと以下の例外が発生します。
>
> [System.InvalidOperationException: 選択されたファイルが多すぎます。選択するファイルの数を減らしてからやり直してください。

具体的にはいくつ位のファイルを指定していますか?
>選択されたファイルが多すぎます。
とあるのでとても気になるのですが。

0
引用返信 編集キー/
■163 / inTopicNo.3)  Re[2]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ C#に首ったけ 二等兵(2回)-(2005/02/28(Mon) 18:09:09)

分類:[C#] 

No162に返信(Mooさんの記事)
> ■No161に返信(C#に首ったけさんの記事)
> > C#のOpenFileDialogで大量のファイルを選択し、開くボタンを
> > 押すと以下の例外が発生します。
> >
> > [System.InvalidOperationException: 選択されたファイルが多すぎます。選択するファイルの数を減らしてからやり直してください。
>
> 具体的にはいくつ位のファイルを指定していますか?
> >選択されたファイルが多すぎます。
> とあるのでとても気になるのですが。

例外が発生した時は400ファイルの時でした。200ファイルの時には大丈夫でした。
※但し、同じ200ファイルでも、ファイルのあるディレクトリに
 より、開ける場合とそうでない場合がありました。
 指定したファイル名のフルパスの合計バイト数により、成否
 が分かれていそうです。

0
引用返信 編集キー/
■164 / inTopicNo.4)  Re[3]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ 名無し 二等兵(1回)-(2005/02/28(Mon) 19:04:09)

分類:[C#] 

上限 8K バイト。

OpenFileDialog には変更オプションはありません。

サイズを変更するためには、OpenFileDialog を継承したクラスで
RunDialog() をオーバーライドします。
RunDialog() は comdlg32.dll の GetOpenFileName() を
呼び出すことになるでしょう。
GetOpenFileName() の引数の OPENFILENAME 構造体へのポインタ
LPOPENFILENAME のメンバ LPOFNHOOKPROC lpfnHook
には、 HookProc をセットしてください。

ご検討をお祈りします。

0
引用返信 編集キー/
■166 / inTopicNo.5)  Re[4]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ えムナウ 二等兵(3回)-(2005/02/28(Mon) 19:15:53)
えムナウ さんの Web サイト

分類:[C#] 

こちらのPRBですね。
http://support.microsoft.com/default.aspx?scid=kb;ja;820631

0
引用返信 編集キー/
■167 / inTopicNo.6)  Re[4]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ 名無し 二等兵(2回)-(2005/02/28(Mon) 19:16:49)

分類:[C#] 

No165に返信(えムナウさんの記事)
> OPENFILENAME の 構造体は nMaxFile = 0x2000; のようですね。
> 8192文字ではないでしょうか?

失礼いたしました。「バイト」よりも「文字」の方が正確ですね。

0
引用返信 編集キー/
■168 / inTopicNo.7)  Re[5]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ えムナウ 二等兵(4回)-(2005/02/28(Mon) 19:28:02)
えムナウ さんの Web サイト

分類:[C#] 

>上限 8K バイト。
8192文字分のバッファが取られているという意味でしょう。
8[kByte]とは違います。

しかし、これだと199ファイルで一ファイル平均42文字以上だと、
やっぱりエラーになる可能性がありますね。


0
引用返信 編集キー/
■169 / inTopicNo.8)  Re[5]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ えムナウ 一等兵(5回)-(2005/02/28(Mon) 19:41:42)
えムナウ さんの Web サイト

分類:[C#] 

> OPENFILENAME の 構造体は nMaxFile = 0x2000; のようですね。
> 8192文字ではないでしょうか?
この情報は動作確認した情報でも、Microsoftが発表している情報でもないので、削除しておきました。
一部話のつながりが悪くなってごめんなさい。

名無しさんも、できれば情報源をリンクしてください。

0
引用返信 編集キー/
■170 / inTopicNo.9)  Re[4]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ C#に首ったけ 二等兵(3回)-(2005/02/28(Mon) 20:13:27)

分類:[C#] 

No164に返信(名無しさんの記事)
> 上限 8K バイト。
>
> OpenFileDialog には変更オプションはありません。
>
> サイズを変更するためには、OpenFileDialog を継承したクラスで
> RunDialog() をオーバーライドします。
> RunDialog() は comdlg32.dll の GetOpenFileName() を
> 呼び出すことになるでしょう。
> GetOpenFileName() の引数の OPENFILENAME 構造体へのポインタ
> LPOPENFILENAME のメンバ LPOFNHOOKPROC lpfnHook
> には、 HookProc をセットしてください。
>
> ご検討をお祈りします。

Mooさん、名無し、えムナウさん、皆さんご指導ありがとうございます。

原因としては、指定したファイル名の合計文字列が一定の文字数を超えた
場合に、エラーとなるということは間違いなさそうですね。
※いろいろ、試しているのですが、ファイル名の合計がいったい何文字で
 エラーになるかは、見切れてないです。

> サイズを変更するためには、OpenFileDialog を継承したクラスで
> RunDialog() をオーバーライドします。
早速、試してみようと思ったのですが、OpenFileDialogクラスがsealedと
なっており継承することが出来ませんでした。

継承出来ないとすると、APIを直接呼び出す?等の対応しかないのでしょうか。
知識が乏しい為、正直理解しきれておりません。








0
引用返信 編集キー/
■173 / inTopicNo.10)  Re[5]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ 名無し 二等兵(4回)-(2005/02/28(Mon) 21:18:13)

分類:[C#] 

No170に返信(C#に首ったけさんの記事)
> > サイズを変更するためには、OpenFileDialog を継承したクラスで
> > RunDialog() をオーバーライドします。
> 早速、試してみようと思ったのですが、OpenFileDialogクラスがsealedと
> なっており継承することが出来ませんでした。

大変失礼いたしました。OpenFileDialog ではなく FileDialog の方です。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsopenfiledialogmemberstopic.asp
を見ると解るとおり、
CheckFileExists --- OpenFileDialog 互換のため
Multiselect --- OpenFileDialog 互換のため
ReadOnlyChecked --- OpenFileDialog 互換のため
ShowReadOnly --- OpenFileDialog 互換のため
OpenFile() --- OpenFileDialog 互換のため
Reset() --- OpenFileDialog 互換のため
RunDialog() --- 文字数を拡張するため
ということになると思います。

> 継承出来ないとすると、APIを直接呼び出す?等の対応しかないのでしょうか。
> 知識が乏しい為、正直理解しきれておりません。
結論から言うと、API 呼び出し以外の解決策は私には思いつきません。
GetOpenFileName() の呼び出しは多少面倒なので、
何らかのオブジェクトに GetOpenFileName() 呼び出しを任せたほうがよいと思います。
ドキュメントを読む限り FileOpen.RunDialog() は呼び出しラッパーと考えるのが自然だと思います。



0
引用返信 編集キー/
■174 / inTopicNo.11)  Re[6]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ C#に首ったけ 二等兵(4回)-(2005/02/28(Mon) 22:09:44)

分類:[C#] 

No173に返信(名無しさんの記事)
> ■No170に返信(C#に首ったけさんの記事)
> > > サイズを変更するためには、OpenFileDialog を継承したクラスで
> > > RunDialog() をオーバーライドします。
> > 早速、試してみようと思ったのですが、OpenFileDialogクラスがsealedと
> > なっており継承することが出来ませんでした。
>
> 大変失礼いたしました。OpenFileDialog ではなく の方です。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsopenfiledialogmemberstopic.asp
> を見ると解るとおり、
> CheckFileExists --- OpenFileDialog 互換のため
> Multiselect --- OpenFileDialog 互換のため
> ReadOnlyChecked --- OpenFileDialog 互換のため
> ShowReadOnly --- OpenFileDialog 互換のため
> OpenFile() --- OpenFileDialog 互換のため
> Reset() --- OpenFileDialog 互換のため
> RunDialog() --- 文字数を拡張するため
> ということになると思います。
>
> > 継承出来ないとすると、APIを直接呼び出す?等の対応しかないのでしょうか。
> > 知識が乏しい為、正直理解しきれておりません。
> 結論から言うと、API 呼び出し以外の解決策は私には思いつきません。
> GetOpenFileName() の呼び出しは多少面倒なので、
> 何らかのオブジェクトに GetOpenFileName() 呼び出しを任せたほうがよいと思います。
> ドキュメントを読む限り FileOpen.RunDialog() は呼び出しラッパーと考えるのが自然だと思います。
>
>

名無しさん、度々ご指摘ありがとうございます。
FileDialogを継承する方向でやってみます。

そこで、さっそく、FileDialogを継承したクラスを作成しようとしたところ、
以下のコンパイルエラーが発生してしまい、いきなりつまずいてしまいました。

「error CS0534: 'WindowsApplication1.test' は継承抽象メンバ 'System.Windows.Forms.FileDialog.RunFileDialog(System.Windows.Forms.NativeMethods.OPENFILENAME_I)' を実装しません。」

RunFileDialogを実装しようとしても、OPENFILENAME_Iがアクセス出来ない
保護レベルとなっているようです。

上記エラーの回避方法はあるのでしょうか。




0
引用返信 編集キー/
■175 / inTopicNo.12)  Re[7]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ 名無し 一等兵(5回)-(2005/03/01(Tue) 10:42:21)

分類:[C#] 

No174に返信(C#に首ったけさんの記事)
> そこで、さっそく、FileDialogを継承したクラスを作成しようとしたところ、
> 以下のコンパイルエラーが発生してしまい、いきなりつまずいてしまいました。
>
> 「error CS0534: 'WindowsApplication1.test' は継承抽象メンバ 'System.Windows.Forms.FileDialog.RunFileDialog(System.Windows.Forms.NativeMethods.OPENFILENAME_I)' を実装しません。」
>
> RunFileDialogを実装しようとしても、OPENFILENAME_Iがアクセス出来ない
> 保護レベルとなっているようです。

重ね重ねすみません。
抽象メンバ RunFileDialog が System.Windows.Forms.NativeMethods を引数としているので、
ユーザーが FileDialog を継承することは出来ないですね。
もう一つ上の CommonDialog からだったら継承できることは確認できましたが、
結構作りこみが必要になりそうです。以下 Win2K 以降のみで有効な概要

using System;
using System.Runtime.InteropServices;

public class MyOpenFileDialog : System.Windows.Forms.CommonDialog
{
public override void Reset()
{
}

protected override bool RunDialog(System.IntPtr hwndOwner)
{
bool ret = false;
OPENFILENAME_I ofn = new OPENFILENAME_I();
int size = 0x2000;
string fn = new string( '\0', size );
ofn.lpstrFile = Marshal.StringToBSTR( fn );
try
{
ofn.nMaxFile = size;
ofn.Flags = 0x00000200 | 0x00080000;

ret = GetOpenFileName( ofn );
if ( ret )
{
fn = Marshal.PtrToStringBSTR( ofn.lpstrFile );
string [] fns = fn.Split( new char[] { '\0' } );
// ToDo: FileNames 等を設定する。
}
}
finally
{
// Marshal.StringToBSTR で割り当てられた アンマネージ メモリ を開放する。
Marshal.FreeBSTR( ofn.lpstrFile );
}
return ret;
}

[DllImport("comdlg32.dll", CharSet=CharSet.Auto)]
private static extern bool GetOpenFileName([In, Out] OPENFILENAME_I ofn);

private delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)]
private class OPENFILENAME_I
{
public int lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
public string lpstrFilter;
public IntPtr lpstrCustomFilter;
public int nMaxCustFilter;
public int nFilterIndex;
public IntPtr lpstrFile;
public int nMaxFile;
public IntPtr lpstrFileTitle;
public int nMaxFileTitle;
public string lpstrInitialDir;
public string lpstrTitle;
public int Flags;
public short nFileOffset;
public short nFileExtension;
public string lpstrDefExt;
public IntPtr lCustData;
public WndProc lpfnHook;
public string lpTemplateName;
public IntPtr pvReserved; // Win2K 以降
public int dwReserved; // Win2K 以降
public int FlagsEx; // Win2K 以降
public OPENFILENAME_I()
{
this.lStructSize = 0x58; // Win2K 以降
}
}
}

(続く)


0
引用返信 編集キー/
■176 / inTopicNo.13)  Re[8]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ 名無し 一等兵(6回)-(2005/03/01(Tue) 11:16:27)

分類:[C#] 

(続き)
GetOpenFileName() や OPENFILENAME を MSDN や (VC7の)CommDlg.h 等で確認していただくと解ると思いますが、
LPTSTR lpstrFile 等、ANSI/Unicode の区別が必要になったり、
Win2K 前後で DWORD lStructSize の調整(0x4c/0x58)が必要になったりしますので、
プラットホームの違いを吸収するヘルパークラスを作ったほうがよいと思います。

それと平行して、OpenFileDialog を参考に必要な機能を実装していくとよいのではないでしょうか。


0
引用返信 編集キー/
■177 / inTopicNo.14)  Re[9]: OpenFileDialogの開ける最大ファイル数、サイズ
□投稿者/ C#に首ったけ 一等兵(5回)-(2005/03/01(Tue) 12:56:50)

分類:[C#] 

No176に返信(名無しさんの記事)
> (続き)
> GetOpenFileName() や OPENFILENAME を MSDN や (VC7の)CommDlg.h 等で確認していただくと解ると思いますが、
> LPTSTR lpstrFile 等、ANSI/Unicode の区別が必要になったり、
> Win2K 前後で DWORD lStructSize の調整(0x4c/0x58)が必要になったりしますので、
> プラットホームの違いを吸収するヘルパークラスを作ったほうがよいと思います。
>
> それと平行して、OpenFileDialog を参考に必要な機能を実装していくとよいのではないでしょうか。

度重なるご指導ありがとうございました。
これで、解決出来そうです。

あとは、MSDNなどとにらめっこしながら、
必要な機能を実装していくようにします。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -