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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.19291 の関連記事表示

<< 0 >>
■19291  ファイルのコピーができません
□投稿者/ たくあん -(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を二つ結合すると成功した」とあったので試しましたがやはり駄目でした。
    もう私ではどこがおかしいのか皆目検討つきません。
    どなたかよろしくお願いします。
親記事 /過去ログ37より / 関連記事表示
削除チェック/

■19294  Re[1]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 -(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 のメンバに渡すというのは、かなり違和感が…。
    
    それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19293  Re[1]: ファイルのコピーができません
□投稿者/ やじゅ -(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
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

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

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

    ファイル名を、フルパスで書いてみるとか。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19325  Re[2]: ファイルのコピーができません
□投稿者/ ゆう -(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にしても駄目でした。

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

    よろしくお願いします。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19330  Re[3]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 -(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 を取り除いてしまったのは、何故でしょうか?


    最後に、先ほどと同じ
    >> それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。
    を繰り返し書いておきます。定数宣言がどうなっているのかなども気になるので。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19333  Re[3]: ファイルのコピーができません
□投稿者/ よねKEN -(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
    > 最後に、先ほどと同じ
    >>> それぞれのメンバには、具体的にはどういった値を設定しているのでしょうか。
    >を繰り返し書いておきます。定数宣言がどうなっているのかなども気になるので。

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

記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

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

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

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

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

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

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

    という情報でいいのでしょうか?
    それともまだ勘違いしていますか?
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19349  Re[5]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 -(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)) の埋め込み状況なども。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19350  Re[6]: ファイルのコピーができません
□投稿者/ たくあん -(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の埋め込みは特にはしていません。

    こんな情報で大丈夫でしょうか?
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

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

    > Nullの埋め込みは特にはしていません。
    必要なので、付け加えておいてください。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19365  Re[8]: ファイルのコピーができません
□投稿者/ たくあん -(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の埋め込みは特にはしていません。
    > 必要なので、付け加えておいてください。

    なるほど。了解しました。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19394  Re[9]: ファイルのコピーができません
□投稿者/ Jitta on the way -(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 には、何を代入するのでしょう?
    (コードの意味を理解していますか?)
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/

■19399  Re[9]: ファイルのコピーができません
□投稿者/ 魔界の仮面弁士 -(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 型というわけでも無いのに)。
記事No.19291 のレス /過去ログ37より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -