(1) FDとMOと固定ディスクの区別をデバイス単位でしりたいのですが。     コーディング方法を教えてください。                  (2) FD・moの使用できるバイト数を取得するコーディグ方法を教えてください

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Windows APIの



GetDriveTypeとGetFreeSpaceを使用します。

サンプルソースのあるホームページを紹介しておきます。

参考URL:http://www.wombat.or.jp/tomoyashuttle/shtml/vbap …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QTextFieldParserの固定長桁数をバイト単位で指定したい

TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。

'VBのコード-----------------------------------------------
  Public Shared Sub Main()
    Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
      reader.TextFieldType = FieldType.FixedWidth
      reader.SetFieldWidths(2, 7, 2)

      Dim currentFields() As String
      While Not reader.EndOfData
        Try
          currentFields = reader.ReadFields() ' 一行読込
          Dim currentField As String
          For Each currentField In currentFields
            Trace.WriteLine(currentField)
          Next
        Catch ex As MalformedLineException
          MessageBox.Show(ex.Message)
        End Try
      End While
    End Using
  End Sub
'VBのコード ここまで------------------------------------

<読み込む固定長ファイル>
01やまだいちろう26
02やまだじろう 23


<実行結果>
01
やまだいちろう
26
02
やまだじろう
23


>reader.SetFieldWidths(2, 7, 2)
この部分を
>reader.SetFieldBytes(2,14,2) '関数名は適当
このように指定できないか、と考えています。

TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。

'VBのコード-----------------------------------------------
  Public Shared Sub Main()
    Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
      reader...続きを読む

Aベストアンサー

もしかすると的外れかもしれないですが……
要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく
なるので全角は二バイト文字として処理したいということでしょうか?

> FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です

UTF-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う
時点で「全角は 2 バイト」というのは破綻してしまうと思います。

# たしかに Shift_JIS なので全角は 2 バイトですが……
# 文字は全角も半角も一文字と数えるという仕様なのだと思われます。

一旦、一行全て読み込み、文字列をバイト配列に変換して処理するのは
いかがでしょうか?

取り敢えず、こんな感じで貼られていたコードを部分的に変更してみま
した。

※ 見栄え上、全角文字列でインデントしてあります。
  拙いコードですのが、ご容赦下さい。

REM 動作確認した時に関数にしたのでそのままです。
Sub ReadFile()
 Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
  REM reader.TextFieldType = FieldType.FixedWidth
  REM reader.SetFieldWidths(2, 7, 2)
  reader.TextFieldType = FieldType.Delimited

  Dim currentFields() As String
  While Not reader.EndOfData
   Try
    REM currentFields = reader.ReadFields() ' 一行読込
REM 読み込みと同時に関数へ渡す
    currentFields = GetFieldString(reader.ReadLine, "SHIFT_JIS", 2, 14, 2)
    Dim currentField As String
    For Each currentField In currentFields
     Trace.WriteLine(currentField)
    Next
   Catch ex As MalformedLineException
    MessageBox.Show(ex.Message)
   End Try
  End While
 End Using
End Sub

Function GetFieldString(ByRef Str As String, ByRef strEncode As String, ByVal ParamArray Prams() As Integer) As String()
 Dim iPram As Integer
 Dim iIndex As Integer = 0
 Dim iStrP As Integer = 0
 Dim strArray As String() = {""}
REM バイト配列に変換
 Dim ByteArray As Byte() = Encoding.GetEncoding(strEncode).GetBytes(Str)

 For Each iPram In Prams
REM 文字列に変換して文字列の配列に格納
  strArray(iStrP) = Encoding.GetEncoding(strEncode).GetString(ByteArray, iIndex, iPram)
  iStrP = iStrP + 1
  ReDim Preserve strArray(iStrP)
  iIndex = iIndex + iPram
 Next
REM 余分な配列を除く
 ReDim Preserve strArray(iStrP - 1)
 Return strArray
End Function

もしかすると的外れかもしれないですが……
要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく
なるので全角は二バイト文字として処理したいということでしょうか?

> FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です

UTF-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う
時点で「全角は 2 バイト」というのは破綻してしまうと思います。

# たしかに Shift_JIS なので全角は 2 バイトですが……
# 文字は全角も半角も一文字と数えるという...続きを読む

Q.NET Stringからバイト数を取得する。

初歩的な質問で申し訳ありません。

Stringから桁数ではなくバイト数を
取得する方法を教えてください。

Dim a As String
a = "00あ"

とあった場合、
aから4という結果がほしいです。

よろしくお願いします。

Aベストアンサー

こんにちは。

文字列の文字数・バイト数を取得する
http://www.bcap.co.jp/hanafusa/dotnet/moji02.htm
どうぞ。

QVB2005 で NetworkStream で取得したデータのバイト数の取得方法について

VB2005 の初心者です。

System.Net.Sockets を利用して、Windows端末のAシステムとLinux端末のBシステムの通信部分のサービスを開発しています。

その際、NetworkStream で受信したデータのバイト数を取得したいのですが、やり方が分かりません。

データを取得している部分のソースは下記です。
10000バイトずつ取得していますが、
最後、10000バイトに満たない場合、取得したデータのバイト数が知りたいです。

Dim LNetworkStream As NetworkStream
Dim LbEndFlg  As Boolean
Dim LucData(10000) As Byte

Do While LbEndFlg
LNetworkStream = objClient.GetStream()

Redim LucData(10000)
LsLen = LNetworkStream.Read(LucData, 0, LucData.Length)

 LbEndFlg = FindEndOfClaim(LucData)
LstrText = System.Text.Encoding.UTF8.GetString(LucData, 0, LsLen)

MstrXML = MstrXML & LstrText

Loop


NetworkStream には、SetLength というメソッドがありますが、
これは必ず例外を発生させてしまうので、
例外を発生させずにバイト数を取得したいです。

何かヒントになることでも良いので、
皆様の知恵をお借りできれば幸いです。
よろしくお願い致します。

VB2005 の初心者です。

System.Net.Sockets を利用して、Windows端末のAシステムとLinux端末のBシステムの通信部分のサービスを開発しています。

その際、NetworkStream で受信したデータのバイト数を取得したいのですが、やり方が分かりません。

データを取得している部分のソースは下記です。
10000バイトずつ取得していますが、
最後、10000バイトに満たない場合、取得したデータのバイト数が知りたいです。

Dim LNetworkStream As NetworkStream
Dim LbEndFlg  As Boolean
Di...続きを読む

Aベストアンサー

追記。

>以下のように「自分で実装する必要」があります。

もちろん、自分で実装などせずに「ReadTimeoutプロパティに適切な値をセットし、DataAvailableプロパティがTrueだろうがFalseだろうが構わずにReadメソッドを呼び出し、Readメソッドが0以外を返した場合は処理を継続し、Readメソッドが0を返した場合はセッションが切れたかタイムアウトした時だからそこで強制終了する」と言う実装をした方が、遥かに簡単です。

Qファイル/フォルダアドレスの取得と区別

VB6
ファイル/フォルダのアドレスを取得してファイル/フォルダの区別を
したいのですが、特定の物(サーバー内)がエラーしてしまいます。
リストへ"OLEDragDrop"した時に下記実行させています。
MsgBox Data.Files(1)
MsgBox GetAttr(Data.Files(1))
MsgBox Dir(Data.Files(1))
MsgBox Dir(Data.Files(1), vbDirectory)

エラーの対象 AとB & 問題無い C
A>ファイルの種類:Windows Server
A>アドレス:\\server
B>コンピューターの種類:Windows Server
B>アドレス:\\server\TestB
C>ファイルの種類:ファイルフォルダ
C>アドレス:\\St_server\TestB\TestC

Aは全てエラー
>実行時エラー'461':
>データの形式が一致しません。

Bはアドレスは取得出来て"Dir"でエラー (GetAttr = 16)
>実行時エラー'52':
>ファイル名または番号が不正です。

Bはアドレスを取得出来てるのでエラー処理で
なんとかなりそうなのですが、Aはアドレスすら取得出来ません。

Aのアドレスを取得するにはどうしたら良いでしょうか?
(サーバーは社内管理していて詳しくありません)

VB6
ファイル/フォルダのアドレスを取得してファイル/フォルダの区別を
したいのですが、特定の物(サーバー内)がエラーしてしまいます。
リストへ"OLEDragDrop"した時に下記実行させています。
MsgBox Data.Files(1)
MsgBox GetAttr(Data.Files(1))
MsgBox Dir(Data.Files(1))
MsgBox Dir(Data.Files(1), vbDirectory)

エラーの対象 AとB & 問題無い C
A>ファイルの種類:Windows Server
A>アドレス:\\server
B>コンピューターの種類:Windows Server
B>アドレス:\\server\TestB
C>ファ...続きを読む

Aベストアンサー

私の方でも確認しました。確かに、コンピュータ名をドロップした場合、
Files プロパティにアクセスできないですね。

以下のコードを使えば、コンピュータ名は取得できました。

Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long

Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim CF_FILENAMEW As Long
Dim file As String
CF_FILENAMEW = RegisterClipboardFormat("FileNameW")
If CF_FILENAMEW > 32767 Then CF_FILENAMEW = CF_FILENAMEW - 65536 ' 16bit値に変換
If Data.GetFormat(CF_FILENAMEW) Then
file = Split(Data.GetData(CF_FILENAMEW), Chr(0))(0) ' 末尾の'\0'を削除
MsgBox file
End If
End Sub

私の方でも確認しました。確かに、コンピュータ名をドロップした場合、
Files プロパティにアクセスできないですね。

以下のコードを使えば、コンピュータ名は取得できました。

Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long

Private Sub LI1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim CF_FILENAMEW As Long
Dim file A...続きを読む

Qデバイスマネージャーの一覧取得

デバイスマネージャーの一覧取得

VB2005,Framework2使用です。

現在PCで使用されているデバイスドライバ名を表示させたく、デバイスマネージャーに表示されているデバイス名を列挙し配列に収めたいのですが、調べてみたところSetup API等を使用すると可能な様ですが、VBではどのように記述すれば良いのでしょうか?

API利用までの知識がないのでここで凄く挫折しています・・



VBではありませんが、以下のサイトが参考になると思います。
参考:http://www.usefullcode.net/2006/12/post_19.html


よろしくお願いします。

Aベストアンサー

WMIのWin32_PnPEntityを使ってみるのはどうでしょうか?

Imports System
Imports System.Management ' 参照設定が必要
Module Module1
  Sub Main()
    Try
      Dim searcher As ManagementObjectSearcher
      searcher = New ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity")
      For Each queryObj As ManagementObject In searcher.Get()
        Console.WriteLine("{0}", queryObj("Name"))
      Next
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    End Try
  End Sub
End Module

必要な情報は
http://www.anchorsystems.jp/anchor/ashp/netmon/samples/wmi_hard.html#Win32_PnPEntity.htm
を参考にしてみてください。

WMIのWin32_PnPEntityを使ってみるのはどうでしょうか?

Imports System
Imports System.Management ' 参照設定が必要
Module Module1
  Sub Main()
    Try
      Dim searcher As ManagementObjectSearcher
      searcher = New ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity")
      For Each queryObj As ManagementObject In searcher.Get()
        Console.WriteLine("{0}", queryObj("Name"))
      Next
    Catch ex As Exception...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報