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

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

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

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 >>
■82879  Re[3]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 15:08:56)
    No82877 (がもう さん) に返信
    > このページにあるようにDir関数では、
    > 256文字以上のファイルパスを取得することができないはずです。

    「X:\ 256文字のパス文字列 <NUL>」が 260文字分である(MAX_PATH) ということですね。


    > しかし私の環境では260文字であっても普通に取得することができます。

    Dir 関数から長いパスが返ってくる場合の話でしょうか。
    それとも、Dir 関数に長いパスを渡す場合の話でしょう。

    たとえば手元の環境では、
     ' Len(fileName) < MAX_PATH
     ' Len(fullPath) > MAX_PATH
     fullPath = folderPath & "\" & fileName
    のような場合において、
     S = Dir(folderPath & "*.*")
    は取得できても、
     S = Dir(fullPath)
    のように指定することはできません。

    VBA
     エラー53
     ファイルが見つかりません

    .NET
     PathTooLongException
     指定されたパス、ファイル名、またはその両方が長すぎます。完全限定型名は 260 文字未満で指定し、ディレクトリ名は 248 未満で指定してください。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82878  Re[3]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 14:42:11)
    あと、
    フォルダーのリネーム、削除はどのようにすれば良いですか?
    https://msdn.microsoft.com/ja-jp/library/cc429618.aspx

    このページには、ディレクトリもいけると書かれてあるのですが
    フォルダーパスを指定しても、移動したり、削除したりすることができないのですが・・・
     
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82880  Re[4]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 15:30:46)
    No82878 (がもう さん) に返信
    > フォルダーのリネーム、削除はどのようにすれば良いですか?
    > https://msdn.microsoft.com/ja-jp/library/cc429618.aspx

    C:\OLD_FOLDER_NAME\ を NEW_FOLDER_NAME に改名するなら

    oldPath = "\\?\C:\OLD_FOLDER_NAME" & vbNullChar
    newPath = "\\?\C:\NEW_FOLDER_NAME" & vbNullChar

    ですね。MoveFileW の引数は MarshalAs(UnmanagedType.LPWStr) にしています。
    vbNullChar は省略しても良さそうですが一応指定。


    > 移動したり、削除したりすることができないのですが・・・

    パス全体の長さとは別に、アイテム単位の長さ制限もあったはずですが、
    拡張エラー情報は何を返してきていますか?
     Dim x = Err.LastDllError
     Dim y = Marshal.GetLastWin32Error()
     Dim z As New Win32Exception()


    たとえば上記の MoveFileW の例でいえば、
     newPath = "\\?\C:\" & StrDup(255, "X") & vbNullChar
    へのリネームは行えますが、
     newPath = "\\?\C:\" & StrDup(256, "X") & vbNullChar
    となると、「New Win32Exception(123)」相当の理由で失敗します。


    ※ .NET 4.6.2 + ローカルポリシー「Win32 の長いパスを有効にする」を指定した場合の結果は未確認です。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82881  Re[5]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 16:07:48)
    ありがとうございます。

    ありがとうございます。

    一つずつ質問いたします。


    <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
    Function MoveFileW(ByVal src As String, ByVal dst As String) As Boolean
    End Function


    MoveFileW("\\?\D:\新しいフォルダー" & vbNullChar, "\\?\C:\ddd" & vbNullChar)


    とやってみたのですがフォルダーの移動・リネームは行われません

    なにが原因でしょうか?

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

■82883  Re[6]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 16:10:49)
    > S = Dir(folderPath & "*.*")
    > は取得できても、
    > S = Dir(fullPath)

    そうです、前者のパターンで使用しています。

    パスを直接指定しない場合には260文字制限がないのでしょうか?

    検索しても見つかりませんでしたが
    何文字までいけるのでしょうか?
     
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82886  Re[7]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 16:57:30)
    2017/02/17(Fri) 16:58:03 編集(投稿者)

    No82883 (がもう さん) に返信
    > S = Dir(folderP> パスを直接指定しない場合には260文字制限がないのでしょうか?

    引数の長さに制限があるということですね。なので、引数に
    「C:\200文字のフォルダ\200文字のサブフォルダ\*.TXT」
    を指定するのならアウトでしょう。

    しかし、「C:\200文字のフォルダ」のサブフォルダを調べることなら、
    DirectoryInfo.GetFileSystemInfos メソッドや Dir でも行えます。

    とはいえ、サブフォルダあるいはファイルの FileInfo インスタンスを
    得られたとしても、使用できるのは一部のメンバーに限られます。
    たとえば、FullName プロパティにアクセスすれば PathTooLongException 、
    Delete メソッドを呼べば DirectoryNotFoundException といった具合に。


    > 検索しても見つかりませんでしたが
    > 何文字までいけるのでしょうか?

    VBA の Dir にせよ VB.NET の Dir にせよ .NET の GetFileSystemInfos にせよ
    基本的には FindFirstFile API のラッパーです。

    なので、指定できる引数に対して MAX_PATH 制限が入るわけで。
    https://msdn.microsoft.com/ja-jp/library/cc429233.aspx
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82888  Re[8]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 17:24:10)
    ありがとうございます。
    納得しました。

    一つ上の
    <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
    Function MoveFileW(ByVal src As String, ByVal dst As String) As Boolean
    End Function


    MoveFileW("\\?\D:\新しいフォルダー" & vbNullChar, "\\?\C:\ddd" & vbNullChar)

    がうまくいかない理由についてもご回答願います
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82889  Re[9]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ みい -(2017/02/17(Fri) 17:42:50)
    No82888 (がもう さん) に返信
    > MoveFileW("\\?\D:\新しいフォルダー" & vbNullChar, "\\?\C:\ddd" & vbNullChar)
    >
    > がうまくいかない理由についてもご回答願います

    https://msdn.microsoft.com/ja-jp/library/cc429618.aspx
    の解説欄
    「ディレクトリを他のボリュームへ移動しようとすると、MoveFile 関数が失敗することに注意してください。」
    かな?
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82890  Re[10]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 17:46:21)
    仰る通り、ボリュームを同じにするとうまくいきました。

    もしボリュームを変えたい場合には
    どうすれば良いのでしょうか?
     
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82893  Re[11]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 18:30:14)
    No82890 (がもう さん) に返信
    > 仰る通り、ボリュームを同じにするとうまくいきました。

    System.IO.Directory.Move("D:\DDD", "C:\DDD")
    Rename("D:\DDD", "C:\DDD")

    が失敗するのも同じ理由ですね。
    API というよりは、ファイルシステム側の都合な気もしますが。



    > もしボリュームを変えたい場合には
    > どうすれば良いのでしょうか?

    別ボリュームに新規フォルダを作成し、
    逐次移動(Copy & Delete)させてください。サブフォルダも同様です。


    ちなみに、My.Computer.FileSystem.MoveDirectory は
    ボリューム間の移動に対応していますが、こちらも結局は
    別ボリュームに新規フォルダを作成していたりします。
    (UIOption を指定した場合は SHFileOperation API が使われますが)

    このような事情から、My.Computer.FileSystem.MoveDirectory を使うと、
    別ボリュームだと、フォルダのタイムスタンプが新規作成相当の日時になります。
    同一ボリューム内だとタイムスタンプが更新されないのですけれどね。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82894  Re[12]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 18:47:14)
    ありがとうございます。

    納得しました

    あと、ちなみにフォルダーを削除したい場合にはどうすれば良いですか?

    DeleteFileだとファイルは削除できても
    フォルダーは削除できないのですが・・・
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82895  Re[13]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 19:06:11)
    No82894 (がもう さん) に返信
    > DeleteFileだとファイルは削除できても
    > フォルダーは削除できないのですが・・・

    RemoveDirectory API です。

    System.IO.Directory.Delete メソッドや
    VBA / VB.NET の RmDir もこれを利用しています。


    フォルダーが空で無い場合は、再帰的に消していく必要があります。
    ボリューム間の移動と同じですね。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82896  Re[1]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 19:20:58)
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82897  Re[2]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ がもう -(2017/02/17(Fri) 20:37:09)
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82899  Re[3]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ Azulean -(2017/02/17(Fri) 23:14:08)
    No82897 (がもう さん) に返信
    > このページの説明に
    > Unicode版とANSI版があるとありますが、
    > ANSI版を使うメリットは何なのでしょうか?

    ありません。
    昔の名残です。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82900  Re[3]: 長いパス名のファイルをリネーム、削除する方法
□投稿者/ 魔界の仮面弁士 -(2017/02/17(Fri) 23:45:57)
    No82897 (がもう さん) に返信
    > ANSI版を使うメリットは何なのでしょうか?

    非 Unicode アプリにとっては未だに必要だと思いますが、
    .NET 製アプリなら、あえて A 系を使う必要も無いかと。

    たとえば Win9x だと、SendMessageA はありますが SendMessageW はありません。
    そうした歴史的な事情による名残ですね。


    現在の Windows は Unicode ベースで設計されていましたが、
    Windows 3.1 や Windows 95 などはそうではありませんでした。

    Win16 の頃から ini ファイル読み込みに使われる GetPrivateProfileString API を例に挙げると:

    GetPrivateProfileStringA 関数は Win95、WinMe、WinNT4.0、Win2000、WinXP、Vista、Win10 など、
    いずれのバージョンの Windows でも利用できます。まぁ、WinCE とかは駄目ですが。

    GetPrivateProfileStringW 関数は、Win95、Win98、WinMe 等には存在しません。
    利用できるのは NT 系 の OS、たとえば NT3.51、NT4.0、Win2000、WinXP などに
    限られます。現行バージョンの Windows はすべて W 系に対応しています。


    ただ、非 Unicode アプリケーションは、NT 系であっても A 系が使われたりします。
    (Unicode なファイル名を扱えないアプリは今も沢山ありますよね)

    また、VB4 や VB6 などは、Win9x 系でも WinNT 系でもどちらも動作するよう、
    A 系 API を呼ぶのが一般的となっており、VB6 の既定の文字列マーシャリングも、
    ANSI 版を既定の動作としています。
    VB.NET の Declare ステートメントもそれを踏襲しています。


    こうした歴史背景により、昔からある API については、
    ネットや書籍等で照会されているサンプルの多くが、未だに A 系のままですね。
    理解して使っている人はともかく、サンプルをコピーして利用するだけだと、
    そこまで意識されることもないでしょうし。


    > shift jisには禁則文字がかなりありますし、

    禁則文字、という表現には語弊がある気もしますが、
    9x 系が駆逐された今となっては、A 系に拘る必要も無いでしょうね。


    たとえばルート記号「√」を出力する際に、
    Shift_JIS 0x81E3 のルート記号と
    Shift_JIS 0x8795 のルート記号を区別したい場合、
    W 系だとどちらも U+221A にマッピングされてしまい、
    区別できなくなってしまいます。

    WritePrivateProfileStringA であれば、0x8795 を出力できますが、
    WritePrivateProfileStringW だと、0x81E3 または 0x221A にしかなりません。

    そうした特殊な状況でも無いかぎりは、W 系を使うべきかと思います。
記事No.82875 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82898  新規作成したBitmapのSaveメソッドでエラーが発生する
□投稿者/ はるた -(2017/02/17(Fri) 21:50:34)

    分類:[.NET 全般] 

    VB.net .net Framework 3.5.1 でWebサービスを作成しています。

    指定した文字列からPNGファイルを作成するプログラムを作成したのですが、
    普段動作していたものが急にエラーを出力するようになります。
    一度エラーが発生するとIISのアプリケーションプールをリサイクルするまでは何度実行してもエラーとなります。

    既存ファイルを編集して上書きする場合に同じエラーが発生する情報は見かけるのですが、
    新規作成しているため違う原因だと考えています。

    考えられる原因を教えて下さい。

    <コード>
    Public Shared Function GetCharImage(ByVal txt As String, ByVal fontFileName As String, ByVal fontSize As Single, ByVal imageFormat As Imaging.ImageFormat) As String

    Dim filePath As String = String.Empty
    ' カレントフォルダをAssemblyと同じ場所に変更
    Dim uriPath = System.Reflection.Assembly.GetExecutingAssembly.CodeBase
    Dim uri = New System.Uri(uriPath)
    System.Environment.CurrentDirectory = IO.Path.GetDirectoryName(uri.LocalPath)

    Dim pfc As New System.Drawing.Text.PrivateFontCollection()
    Dim fnt As Drawing.Font = Nothing
    Dim img As Drawing.Bitmap = Nothing
    Dim g As Drawing.Graphics = Nothing
    Dim b As Drawing.SolidBrush = Nothing

    Try

    ' フォントファイルのフルパス
    Dim fontFilePath = IO.Path.GetFullPath(fontFileName)
    ' フォント追加
    pfc.AddFontFile(fontFilePath)
    fnt = New Drawing.Font(pfc.Families(0), fontSize)
    ' ダミーの画像を作成
    img = New Drawing.Bitmap(5000, 5000)
    g = Graphics.FromImage(img)
    b = New Drawing.SolidBrush(Color.Black)
    g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic

    ' 文字列のサイズを取得
    Dim r = g.MeasureString(txt, fnt, img.Width)
    If img IsNot Nothing Then
    img.Dispose()
    img = Nothing
    End If
    ' 保存用画像の作成
    img = New Drawing.Bitmap(CInt(r.Width), CInt(r.Height))
    If g IsNot Nothing Then
    g.Dispose()
    g = Nothing
    End If

    g = Graphics.FromImage(img)

    ' 文字を描画
    g.DrawString(txt, fnt, b, 0S, 0S)
    filePath = String.Format("{0}.{1}", txt, imageFormat.ToString.ToLower)
    ' 画像を保存
    img.Save(filePath, imageFormat) ' ←ここでエラーとなります

    Catch ex As Exception

    Throw

    Finally

    If b IsNot Nothing Then
    b.Dispose()
    b = Nothing
    End If
    If g IsNot Nothing Then
    g.Dispose()
    g = Nothing
    End If
    If img IsNot Nothing Then
    img.Dispose()
    img = Nothing
    End If
    If fnt IsNot Nothing Then
    fnt.Dispose()
    fnt = Nothing
    End If
    If pfc IsNot Nothing Then
    pfc.Dispose()
    pfc = Nothing
    End If

    End Try

    Return filePath

    End Function

    <エラー>
    System.Runtime.InteropServices.ExternalException: GDI+ で汎用エラーが発生しました。
    場所 System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
    場所 CharTest.CharCreator.GetCharImage(String txt, String fontFileName, Single fontSize, ImageFormat imageFormat)
親記事 /過去ログ141より / 関連記事表示
削除チェック/

■82901  Re[1]: 新規作成したBitmapのSaveメソッドでエラーが発生する
□投稿者/ 渋木宏明 -(2017/02/18(Sat) 10:19:11)
    直接の回答ではありませんが。。

    System.Drawing のヘルプ

    https://msdn.microsoft.com/ja-jp/library/system.drawing(v=vs.110).aspx

    の下の方に

    >クラス内で、 System.Drawing 名前空間は、Windows または ASP.NET サービス内での使用はサポートされません。
    >これらのアプリケーションの種類のいずれかの内側からこれらのクラスを使用しようと、予期しない問題が発生する可能性があります、
    >低下しているなどのサービスのパフォーマンスと実行時の例外です。 サポートされている別の方法を参照してください。
    >Windows Imaging Componentsします。

    と書かれていますが、大丈夫でしょうか?
記事No.82898 のレス /過去ログ141より / 関連記事表示
削除チェック/

■84873  CSV出力のタブ応用
□投稿者/ s -(2017/08/11(Fri) 09:54:47)

    分類:[.NET 全般] 

    VB.netでの CSV出力でわからなくなりましたのでご質問です

    仮のコードになりますが
    保存先変数と
    2つの配列の変数と本日の変数があるとします

    private folder as string = "aa\"

    Dim a as string() = {a.text,b.text,c.text}
    Dim b as String() = {d.text,e.text,f.text}
    Dim today As String = Date.Now.ToString("yyyy_MM_dd")


    このデータを CSVとして出力したいのですが
    うまくいきません

    File.WriteAllLines(folder & today & ".csv", a)
    File.AppendAllText(folder & today & ".csv",b)
    File.AppendAllText(folder & today & ".csv",today)

    とやると

    a





    2017_08_11

    というデータが出力されますが

    (欲しいデータ)
    a,b
    a,b
    a,b
    2017_08_11

    したいのです

    カンマを入れたり色々したのですが

    どうも上手くいきません
    同時に今のやり方だと

    日付のCSV1ファイルになってしまうのですが

    できれば 日付でタブ区切りされた(欲しいデータ)
    で 1ファイルで追記apeendしたいのですが

    どのように行えばいいのでしょうか?
    詳しく教えてください

親記事 /過去ログ145より / 関連記事表示
削除チェック/

■84874  Re[1]: CSV出力のタブ応用
□投稿者/ とっちゃん -(2017/08/13(Sun) 13:26:45)
    No84873 (s さん) に返信
    > VB.netでの CSV出力でわからなくなりましたのでご質問です
    >
    <<省略>>

    > このデータを CSVとして出力したいのですが
    > うまくいきません
    >

    <<省略>>
    >
    > どうも上手くいきません

    意図したファイル生成とその手順とがあっていないので
    うまくいっていませんね。

    プログラム的にはプログラムに書かれた通りの動作になっていると思いますけどね。

    > 同時に今のやり方だと
    >
    > 日付のCSV1ファイルになってしまうのですが
    >
    > できれば 日付でタブ区切りされた(欲しいデータ)
    > で 1ファイルで追記apeendしたいのですが
    >
    > どのように行えばいいのでしょうか?

    多分、やりたいことは半分も伝わってきていません。

    さて。。。まぁやりたいことはとりあえず置いておくとして、
    テキストファイルの作成は、
    ノートに手書きで一文字ずつ文字を書いていくのと
    「同じように」
    ファイルに1文字ずつ文字データを書き込んでいくことで実現します。


    追記モードは、書き込んだノートの最後に続けて書いていくことで
    途中にデータを差し込んだりということはしません。
    もちろん、マス目で切った原稿用紙に文字を書き込んであるのと同じ
    状態ですから途中に差し込むなどの編集もできません。


    ということを踏まえて、何をどうすればいいのかをまずはじっくり考えてみることをお勧めします。


    > 詳しく教えてください
    >
    考え方の基礎となる部分は書いておきました。

    ほかの手段としてもう一つ書いておきます。
    .NET Framework を使っているので、実現したいことをサポートする
    ライブラリがあるかもしれません。

    まずは自分の実現したいことを
    「全く知らない他人が見てもわかるように」
    整理整頓し
    そのうえで、ライブラリがないかを探してみてはいかがでしょう。


    ただし、これらはあくまでも考え方であって、作り方はその先にあります。

    頑張ってください。

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

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 >>

パスワード/

- Child Tree -