- 締切済み
アクセス許可
先日ドラッグ&ドロップしたファイルを移動させるというプログラムを作りました。10~15個のファイルなら問題ないのですが30個ぐらいのファイルをドロップすると、「指定されたデバイス、パス、またはファイルにアクセスできません。アクセス許可がない可能性があります」と出ます。 これはどこかで制限がかけられているのでしょうか? もしそうならば対処法を教えて下さい。 VC++6.0のMFCで作りました。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
CStringであれば「文字列長は、メモリが確保出来なくなるまで長く出来る筈」なので、CStringに入れる前の段階で文字列が切れているのでしょう。 つまり「元々途中で切れてる文字列」を使っている可能性が非常に高いです。 もし、DragQueryFile()をカプセル化したクラスライブラリを使用しているなら、以下の点に注意しなければなりません。 1)メンバ変数(プロパティ)に「すべてのファイル名をスペースで区切って連結してある文字列」が格納された物があるなら、そのメンバ変数は「文字列の最大長に限界がある」ので、すべてのファイル名をこの変数から取り出す事は出来ない。この文字列メンバ変数は、ドラッグしたファイル数を表わすメンバ変数(プロパティ)が「1」の時のみしか使用出来ない。 通常、この文字列変数の最大長は「1個のファイルの、パス付きファイル名の最長まで」は保証されますが「2個以上のファイル名をスペースで連結して出来た文字列をすべて保持できる」だけの長さが取れるかは保証されません。 2)複数のファイルをドラッグした場合は、ドラッグしたファイルの数の文字列を持つ「ファイル名のリスト」が格納されたメンバ変数(プロパティ)がある筈なので、そのリストから「文字列を1つ1つ取り出しながら」処理すること。 3)使用後は「クラスオブジェクトの破棄」を忘れないこと。通常、デクストラクタでDragFinish()が呼ばれ、OSが確保した文字列リストが解放される筈なので、必ず破棄しましょう。 ----- VC++6.0じゃない、某Cのクラスライブラリでは「FileName」と「DragFiles.Name[]」と「DragFiles.Count」の3つのプロパティがあり、DragFiles.Name[0]~DragFiles.Name[DragFiles.Count - 1]の中に、1つ1つのファイル名が入って来ます。 VC++6.0のクラスライブラリにも、同様に「複数のファイル名のリスト」を持つメンバ変数(プロパティ)がある筈です。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もしも、ドラッグしてきたファイルのパス名をひとつの char 配列にまとめて入 れているのなら、ファイルが多すぎて=パスが長くなりすぎて、char 配列に収 まりきらないとか。
補足
CStringに入れてます。容量オーバーですか、可能性は高いですね。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>「指定されたデバイス、パス、またはファイルにアクセスできません。 >アクセス許可がない可能性があります」と出ます。 「すでに移動済みのファイルを、もう一度移動しようとした」と「最後にDragFinish()を呼び出してない」に1票づつ。
補足
うーんしかし、数を減らせばいけるので、プログラム自体は大丈夫だと思うのですが。
お礼
なるほど1つ1つチェックしてみます。ありがとうございました。