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

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

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

Re[9]: ファイルのコピーができません


(過去ログ 37 を表示中)

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

■19291 / inTopicNo.1)  ファイルのコピーができません
  
□投稿者/ たくあん (1回)-(2008/05/21(Wed) 19:43:50)

分類:[VB.NET/VB2005] 

とても困っています。
よろしくお願いします。

APIを使ってファイルのコピーをしたいと思っています。
ところが、「ファイルをコピーできません。送り側のファイルまたはディスクから読み取れません。」
というエラーになってしまいます。
ちなみにコピー元ファイルの存在は確認済みです。

ソースは下記のようにしました。
--------------------------------------------------------------------------------------------
'APIの宣言
Private Declare Function SHFileOperation Lib "shell32.dll" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer

'構造体
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
Private Structure SHFILEOPSTRUCT
Dim hwnd As IntPtr
Dim wFunc As Integer
<MarshalAs(UnmanagedType.LPStr)> Dim pFrom As String
<MarshalAs(UnmanagedType.LPStr)> Dim pTo As String
Dim fFlags As Short
<MarshalAs(UnmanagedType.Bool)> Dim fAnyOperationsAborted As Boolean
Dim hNameMappings As IntPtr
<MarshalAs(UnmanagedType.LPStr)> Dim lpszProgressTitle As String
End Structure

'使用個所
Dim udtFileOp As SHFILEOPSTRUCT

'' 構造体の設定
With udtFileOp
.fFlags = mlngOperationFlg
.hwnd = mlngTarget
.pFrom = strFrom
.pTo = strTo
.wFunc = lngFunc
End With
Ret = Not CBool(SHFileOperation(udtFileOp))

-------------------------------------------------------------------------------------
ネットで調べたところ、「pFromとpToにそれぞれの末尾にNullを二つ結合すると成功した」とあったので試しましたがやはり駄目でした。
もう私ではどこがおかしいのか皆目検討つきません。
どなたかよろしくお願いします。
引用返信 編集キー/
■19293 / inTopicNo.2)  Re[1]: ファイルのコピーができません
□投稿者/ やじゅ (391回)-(2008/05/21(Wed) 20:08:37)
No19291 (たくあん さん) に返信
> ネットで調べたところ、「pFromとpToにそれぞれの末尾にNullを二つ結合すると成功した」とあったので試しましたがやはり駄目でした。
> もう私ではどこがおかしいのか皆目検討つきません。
> どなたかよろしくお願いします。

Structure SHFILEOPSTRUCTの見直し?
ファイルをごみ箱に捨てる
pFrom = "C:\Hoge.txt" & Chr(0) & Chr(0)
pTo = Chr(0) & Chr(0)
http://papanvb.i-love-vb.net/tabid/69/forumid/1/threadid/42/scope/posts/Default.aspx

NET Framework 2.0以降なら↓
My.Computer.FileSystem.CopyDirectoryメソッドを使用する方法
http://dobon.net/vb/dotnet/file/copyfolder.html
引用返信 編集キー/
■19294 / inTopicNo.3)  Re[1]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 (736回)-(2008/05/21(Wed) 20:15:08)
No19291 (たくあん さん) に返信
> APIを使ってファイルのコピーをしたいと思っています。

API を使ってのコピーを行おうとしておられますが、
  My.Computer.FileSystem.CopyFile(String, String, UIOption, UICancelOption)
等では駄目なのでしょうか。


また、API 宣言で、ANSI 版の方を使おうとしているようですが、
Unicode や Auto で使わないのには、何か理由があっての事でしょうか。

以下、参考情報。(別の API ですけれども)
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html


> With udtFileOp
>     .fFlags = mlngOperationFlg
>     .hwnd = mlngTarget
>     .pFrom = strFrom
>     .pTo = strTo
>     .wFunc = lngFunc
> End With

# 接頭辞が "lng" な変数を Int32 のメンバに渡すというのは、かなり違和感が…。

それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。

引用返信 編集キー/
■19305 / inTopicNo.4)  Re[1]: ファイルのコピーができません
□投稿者/ Jitta on the way (94回)-(2008/05/22(Thu) 07:34:20)
No19291 (たくあん さん) に返信

構造体は ansi だけど、バインドする関数は unicode を期待しているのでは?

ファイル名を、フルパスで書いてみるとか。
引用返信 編集キー/
■19325 / inTopicNo.5)  Re[2]: ファイルのコピーができません
□投稿者/ ゆう (5回)-(2008/05/22(Thu) 11:18:03)
2008/05/22(Thu) 11:19:39 編集(投稿者)
2008/05/22(Thu) 11:19:16 編集(投稿者)

No19305 (やじゅさん、魔界の仮面弁士さん、Jitta on the wayさん) に返信

皆様、早速のお返事ありがとうございます。
投稿者のたくあんです。

説明が不足していてすいませんでしたm(_ _)m
今開発中の環境ではFrameWork1.1なので、CopyFile等を使う事は出来ない状態です。


皆様にご指摘いただいた通り、下記のようにしてみたのですがやっぱり同じ結果でした。
私が勘違いしているのでしょうか?

--------------------------------------------------------------------------------------------
'APIの宣言
Private Declare Unicode Function SHFileOperation Lib "shell32.dll" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer

'構造体
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
Private Structure SHFILEOPSTRUCT
Dim hwnd As IntPtr
Dim wFunc As Integer
Dim pFrom As String
Dim pTo As String
Dim fFlags As Short
Dim fAnyOperationsAborted As Boolean
Dim hNameMappings As IntPtr
Dim lpszProgressTitle As String
End Structure

'使用個所
Dim udtFileOp As SHFILEOPSTRUCT

'' 構造体の設定
With udtFileOp
.fFlags = mlngOperationFlg
.hwnd = mlngTarget
.pFrom = Marshal.StringToCoTaskMemUni(strFrom)
.pTo = Marshal.StringToCoTaskMemUni(strTo)
.wFunc = lngFunc
End With
Ret = Not CBool(SHFileOperation(udtFileOp))

-------------------------------------------------------------------------------------
同じ形でUnicodeをAutoやAnsiにしても駄目でした。

自分が激しく勘違いをしている気がするのですが…

よろしくお願いします。
引用返信 編集キー/
■19330 / inTopicNo.6)  Re[3]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 (738回)-(2008/05/22(Thu) 12:32:31)
> Private Declare Unicode Function SHFileOperation Lib "shell32.dll" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
>
> <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
> Private Structure SHFILEOPSTRUCT

Unicode API に、ANSI 構造体を渡しては不味いですよ。

Auto でも Unicode でも ANSI でも良いですが、いずれかに統一しないと、
呼び出し時に文字列データが壊れるなどの問題が発生してしまいます。

それと、折角書いてあった MarshalAsAttribute を取り除いてしまったのは、何故でしょうか?


最後に、先ほどと同じ
>> それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。
を繰り返し書いておきます。定数宣言がどうなっているのかなども気になるので。
引用返信 編集キー/
■19333 / inTopicNo.7)  Re[3]: ファイルのコピーができません
□投稿者/ よねKEN (150回)-(2008/05/22(Thu) 13:00:21)
闇雲に書き換えるのではなく、自分の書いているコードの意味を理解するようにした方がよいと思います。
(他の方のご指摘と重複しますが)気になる点を書いてみます。

> '構造体
> <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
<StructLayout(LayoutKind.Sequential, CharSet:=.Unicode, Pack:=1)> _

> Private Structure SHFILEOPSTRUCT
> Dim hwnd As IntPtr
> Dim wFunc As Integer
> Dim pFrom As String
> Dim pTo As String
> Dim fFlags As Short
> Dim fAnyOperationsAborted As Boolean
> Dim hNameMappings As IntPtr
> Dim lpszProgressTitle As String
> End Structure
>
> '使用個所
> Dim udtFileOp As SHFILEOPSTRUCT
>
> '' 構造体の設定
> With udtFileOp
> .fFlags = mlngOperationFlg
> .hwnd = mlngTarget
> .pFrom = Marshal.StringToCoTaskMemUni(strFrom)

.pFrom = strFrom & ControlChars.NullChar & ControlChars.NullChar

> .pTo = Marshal.StringToCoTaskMemUni(strTo)

.pTo = strTo & ControlChars.NullChar & ControlChars.NullChar

> .wFunc = lngFunc
> End With
> Ret = Not CBool(SHFileOperation(udtFileOp))

これでうまく行きそうな気はしますが、ご提供いただいている情報が不足しているため、
本当にうまくいくかどうかはわかりません。
仮にうまく行ったとして、意味は理解してくださいね。

No19294No19330の魔界の仮面弁士さんのご指摘にあることですが、

No19330
> 最後に、先ほどと同じ
>>> それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。
>を繰り返し書いておきます。定数宣言がどうなっているのかなども気になるので。

こちらについて情報を提供してください。
ここを明らかにすれば答えに一歩近づくと思います。


引用返信 編集キー/
■19339 / inTopicNo.8)  Re[4]: ファイルのコピーができません
□投稿者/ たくあん (2回)-(2008/05/22(Thu) 13:29:25)
No19333 (魔界の仮面弁士さん、よねKENさん) に返信

お返事有難うございます。

お二人のご指摘のようにコードをUnicodeで統一してみたのですがやはり駄目でした…

> 闇雲に書き換えるのではなく、自分の書いているコードの意味を理解するようにした方がよいと思います。
お恥ずかしい限りです。申し訳ありません。

メンバは下記のようになっています。

fFlags:mlngOperationFlg = 16
hwnd :mlnTarget = 722160
pFrom :strFrom = コピー元ファイルのフルパス
pTo :strTo = コピー先ファイルのフルパス
wFunc :lngFunc = &H2S

という情報でいいのでしょうか?
それともまだ勘違いしていますか?
引用返信 編集キー/
■19349 / inTopicNo.9)  Re[5]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 (739回)-(2008/05/22(Thu) 14:20:52)
No19339 (たくあん さん) に返信
> wFunc :lngFunc = &H2S
つまり FO_COPY ですね。ここは問題無し。
(ファイルやフォルダのコピー動作を指示するオプション)

> fFlags:mlngOperationFlg = 16
つまり FOF_NOCONFIRMATION ですね。
(表示されるダイアログボックスで、[はい] や [すべて] を選択させるオプション)

> hwnd :mlnTarget = 722160
この値は固定値ではなく、変化しうる値のはずですが、ここに渡す IntPtr 値は、
どのようにして得ていますか?

> pFrom :strFrom = コピー元ファイルのフルパス
> pTo :strTo = コピー先ファイルのフルパス
可能であれば、これらの具体的な内容を教えてください。
また、NULL 文字(vbNullChar/ ControlChars.NullChar / ChrW(0)) の埋め込み状況なども。
引用返信 編集キー/
■19350 / inTopicNo.10)  Re[6]: ファイルのコピーができません
□投稿者/ たくあん (3回)-(2008/05/22(Thu) 14:33:05)
No19349 (魔界の仮面弁士 さん) に返信

お返事ありがとうございます。

>>hwnd :mlnTarget = 722160
> この値は固定値ではなく、変化しうる値のはずですが、ここに渡す IntPtr 値は、
> どのようにして得ていますか?

ウィンドウの存在を確認するAPI:IsWindowより取得しています。


>>pFrom :strFrom = コピー元ファイルのフルパス
>>pTo :strTo = コピー先ファイルのフルパス
> 可能であれば、これらの具体的な内容を教えてください。
> また、NULL 文字(vbNullChar/ ControlChars.NullChar / ChrW(0)) の埋め込み状況なども。

pFrom:
自身のパスと設定ファイル(ini)を連結して文字列のフルパスを作成します。
例:"C:\コピー元\aaa.mdb"

pTo:ダイアログにより指定されたフォルダと設定ファイル(ini)を連結して文字列のフルパスを作成します。
例:"C:\コピー先\aaa.mdb"

Nullの埋め込みは特にはしていません。

こんな情報で大丈夫でしょうか?
引用返信 編集キー/
■19352 / inTopicNo.11)  Re[7]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 (740回)-(2008/05/22(Thu) 14:44:36)
No19350 (たくあん さん) に返信
>>>hwnd :mlnTarget = 722160
>>この値は固定値ではなく、変化しうる値のはずですが、ここに渡す IntPtr 値は、
>>どのようにして得ていますか?
> ウィンドウの存在を確認するAPI:IsWindowより取得しています。
いやいや。
IsWindow は、「Is」というだけあって、その戻り値は BOOL です。
BOOL 値が 722160 になるはずは無いですよね。

> Nullの埋め込みは特にはしていません。
必要なので、付け加えておいてください。
引用返信 編集キー/
■19365 / inTopicNo.12)  Re[8]: ファイルのコピーができません
□投稿者/ たくあん (4回)-(2008/05/22(Thu) 15:37:45)
No19352 (魔界の仮面弁士 さん) に返信

お返事有難うございます。

> いやいや。
> IsWindow は、「Is」というだけあって、その戻り値は BOOL です。
> BOOL 値が 722160 になるはずは無いですよね。

すいません、間違ってました…
hwnd :mlnTarget には、下記のようにウィンドウを取得する構造体のValueがセットされています。

Public Property Target() as Integer
Get
'' ウィンドウ取得
Target = mlngTartget
End Get
Set(ByVal Value As Integer)
''存在チェック
If Is Window(Value) = 0 Then
mlngTarget = 0
Else
''ウィンドウ設定
mlngTarget = Value
End Set
End Property


>>Nullの埋め込みは特にはしていません。
> 必要なので、付け加えておいてください。

なるほど。了解しました。
引用返信 編集キー/
■19394 / inTopicNo.13)  Re[9]: ファイルのコピーができません
□投稿者/ Jitta on the way (95回)-(2008/05/22(Thu) 18:23:06)
2008/05/22(Thu) 18:31:18 編集(投稿者)
2008/05/22(Thu) 18:27:07 編集(投稿者)

No19365 (たくあん さん) に返信
> hwnd :mlnTarget には、下記のようにウィンドウを取得する構造体のValueがセットされています。
>
> Public Property Target() as Integer
> Get
> '' ウィンドウ取得
> Target = mlngTartget
> End Get

え?
これ、実行時にスタック オーバーフローとか発生しません?


Return mlngTartget



ちげ
VB だった
プロパティの get アクセッサで、プロパティ名がメソッド名として扱われるのか


2回目編集

で、Target には、何を代入するのでしょう?
(コードの意味を理解していますか?)
引用返信 編集キー/
■19399 / inTopicNo.14)  Re[9]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 (741回)-(2008/05/22(Thu) 19:00:10)
No19365 (たくあん さん) に返信
> hwnd :mlnTarget には、下記のようにウィンドウを取得する構造体のValueがセットされています。
こちらからの質問の意味は、その mlngTarget を扱うための Target とかいう自作プロパティに、
何を意味する値を、どのようにして設定しているのか、という点についてです。

デスクトップウィンドウのハンドルを指定したいのか、別アプリのウィンドウのハンドルなのか、
自アプリのフォームのハンドルなのか、あるいはもっと別の何かを指定しようとしているのか。
そしてそれは、どのようにした値であるのか…と。


>        If Is Window(Value) = 0 Then
う〜む。どうみても構文エラーになりそうですが。(^_^;)


> Public Property Target() as Integer
そもそも、扱おうとしているのは「ハンドル」なのですから、API 側は通常、
IntPtr 型で宣言する事になりますし、実際、今回はそのように宣言しておられますよね。

にも関わらず、このプロパティが Integer 型で管理されているのは、何のためでしょう?
しかもその内部変数名のプレフィックスが lng というのも謎です(Long 型というわけでも無いのに)。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -