質問があります。
どなたか御教授ください。よろしくお願いします。


【質問】
FTPにて、サーバー側(OS:Solaris LANG:japan TZ:JST )にあるファイルの
更新時間を取得したい。
クライアント(OS:Win2k VB5)

【現状】
Windows標準のwininet.DLLを使用して手製のFTPツールを作成したのですが
サーバー側の情報を取得した所文字化けします。
これはEUC→SJIS変換にて対応しようとしたのですが、VBはエンコーディングが
弱いためこれも手製のエンコーダーを作成したところバグりまくっています。
また、wininet.DLLが日本語に弱い?ためサーバー側をAmerica仕様にしても
日本仕様でわざわざ取得してきます。

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

A 回答 (2件)

以下のHPを参考にするとうまくいきそうな気がします。


取得したファイルのFILETIME構造体をCurrencyに
コピーする作業がいりますけど。
参考にしてください。

http://vbvbvb.com/jp/gtips/0101/gFtpFindFirstFil …
http://plaza5.mbn.or.jp/~heropa/vb16.htm
    • good
    • 0
この回答へのお礼

ありがとうございます。とても参考になります。

みなさまの御教授のおかげで、なんとかできました。
ありがとうございました。

お礼日時:2003/11/24 17:09

> サーバー側の情報を取得した所


どのような方法で?

>手製のエンコーダーを作成したところバグりまくっています。
フリーのライブラリを使えばいいのでは?



>サーバー側をAmerica仕様にしても日本仕様でわざわざ取得してきます。
??

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=175765
    • good
    • 0
この回答へのお礼

情報取得方法は、FtpFindFirstFile関数やFtpCommand関数にてLISTを取得しました。

フリーのライブラリを使用せず、できるだけExeの中で処理を行いたいのです。そのために変換モジュールを作成したのですがこれがなかなか・・・

America仕様というのは語弊でした。すいません。
タイムゾーンの設定でグリニッジ標準時にサーバーを設定しても日本時間でわざわざ取得してくるというものです。
このため、APIにて取得した日時も正常にSystemTime変換できません。 これに関しては???です。

今しばらく調査してみます。
回答ありがとうございました。

お礼日時:2003/10/29 13:24

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QHTTP上にあるファイルの更新日時

タイトルのまんまなんですが、HTTP上にあるファイルをダウンロードして保存するということをやりたいのですが、それをダウンロードする前にダウンロードをしたいファイルの最終更新日時の情報を習得したいなと思うのですが、どのようにプログラムを書いてみればよいのでしょうか?

Aベストアンサー

・HTTPのサイトに接続する
・HEADリクエストを送る
・返されたヘッダーレスポンスから、ファイルの更新日を得る
・更新日より後にダウンロード済みなら終る
・GETリクエストを送る
・返されたヘッダーレスポンスから、ファイルサイズや日付を得る
・引き続いて返されるボディーレスポンスを、仮のファイル名でテンポラリに保存する
・ボディーレスポンスが終了したら、テンポラリに保存したサイズと、ヘッダーレスポンスに書いてあったサイズを比較する
・サイズが不一致なら、ダウンロードが途中で強制終了したか、アップロード時にファイルが壊れたかで、ダウンロードが完了していないので、ダウンロード失敗として処理する
・サイズが一致したら、ダウンロード成功として、テンポラリに一時保存した物を、ダウンロード用フォルダに移動し、正しいファイルネームにリネームする
・正しいファイルネームにリネームしようとした時に、同一名称のファイルが同じフォルダになく、無事にリネーム出来れば終了
・同一名称のファイルが同じフォルダにあり、リネームが失敗した場合は以下の処理をする
・同一名称のファイルが、別のサイトからダウンロードしたまったく別のファイルで、偶然にファイル名が衝突していた場合、ファイル名の後ろに連番を足すなどで、ファイル名の重複を回避する
・同一名称のファイルが、同じサイトからダウンロードした古いファイルで、上書きで消しても構わない場合、古い物を消去してからリネームする
・HTTPのサイトから切断する

ここで必要になるのは
・一時保存用のフォルダ
・ダウンロード用のフォルダ
・ダウンロード用のフォルダの中にある、ダウンロード済みのファイルが、いつ、どこのサイトからダウンロードして、ファイル名重複の為に何番まで連番を足したか、次に使える連番は何番なのか、連番を付加する前の本当のファイル名は何だったかなどを記録した、管理用のデータを記録したファイル
など。

ぶっちゃけ「ブラウザを作る」のと同じだけのテクニックとノウハウが必要。

指定しておいたサイトを自動巡回して画像やファイルを自動ダウンロードしてくれるツールは、もう既に存在するので、新たに作るより、それダウンロードして使った方が早いです。

・HTTPのサイトに接続する
・HEADリクエストを送る
・返されたヘッダーレスポンスから、ファイルの更新日を得る
・更新日より後にダウンロード済みなら終る
・GETリクエストを送る
・返されたヘッダーレスポンスから、ファイルサイズや日付を得る
・引き続いて返されるボディーレスポンスを、仮のファイル名でテンポラリに保存する
・ボディーレスポンスが終了したら、テンポラリに保存したサイズと、ヘッダーレスポンスに書いてあったサイズを比較する
・サイズが不一致なら、ダウンロードが途中で強制終...続きを読む

QWin32APIのFTPクライアントについて

SolarisサーバーからWininetAPIをファイル一覧を取得するFTPクライアントプログラムについての質問です。
FtpFindFirstFile関数を使用しWIN32_FIND_DATA構造体から取得したファイル名をリストボックスに表示しています。
このとき文字化けしてしまい正しいファイル名を取得できません。(タイムスタンプの同様です)
EUCコードからS-JISへの変換が正しく行われていないようなのですが解決方法をご存知の方がおられましたら宜しくお願い致します。

Aベストアンサー

NextFTPで試したところ、やはり漢字ファイル名は文字化けしますが、EUC→SJISに
変換するオプションを選ぶと正しく表示されました。
つまり、EUC→SJIS変換は自動的に行われないので、FTPクライアント側で変換する
必要があります。
具体的な変換方法ですが、WindowsAPIに変換する関数がないようなので、
フリーのDLLを使うか自作するしかないですね。

参考URL:http://www.toxsoft.com/nextftp/index.html

QVBでフォルダ単位のFTP

VBでフォルダ単位のFTP(GET,PUT)はできるのでしょうか?
また、そのサンプルファイルがありましたら、教えて下さい。
ファイル単位での、サンプルファイルはあったのですが、
それを、フォルダ単位に改造する知識がまだないのです。
よろしくお願い致します。

Aベストアンサー

こんにちは 田吾作7@通信苦手です。。。

二つ例を挙げておきますね。
kernel32.dllを使用した場合
http://www.mitene.or.jp/~sugisita/family/papa/vb/
上記URLのコンポーネントの中のFTPクラスにサンプルがあります。

Wininet.dllを使用した場合
http://www.int21.co.jp/pcdn/vb/onepoint/knvol0812.html

ちなみにフォルダを丸ごとのアップというのは無理だったような・・・
何かFTPソフトを使用してますよね?
ぼくもの使用してるFTPソフトは、処理状況をステータスバーで表示してあるので、処理内容が何となく想像がつきます。
ローカルディスクと同じ構造でアップロードするというボタンがあるのですが、やってる事は、ファイルを1つずつアップして、フォルダがあれば作成して、その中のファイルをアップして・・・というようなことを最も下位層のフォルダ内のファイルまでのループ(再帰法?)をしてるようです。

QFTPサーバーから受信したファイル一覧からファイル名だけを取得したいです

こんばんは。いつもお世話になっております。

VB.NET+WinXPなのですが、
FTPサーバーにログインして、
LISTコマンドでファイル一覧を要求すると
「drwxrwxr-x 2 53 53 4096 Feb 28 2006 abc」
などというファイルやフォルダの一覧がかえって来ると思うのですが、
この中からファイル名やフォルダ名だけを取得するには
どうしたらよいでしょうか。
TABやコンマが入っていないので、文字列関数で切り取るにも
区切りがわからないと思うのです。
ローカルドライブのDir関数なら、FileAttribute.Nomalや.Directoryの指定でファイル名だけや
ディレクトリー名だけを指定して
取得することが出来るのですが、FTPサーバーの場合からの場合はどういった方法があるでしょうか。
参考程度でも構いませんので教えて頂けるとたすかります。m(__)m

Aベストアンサー

#1>ファイル名やディレクトリ名にスペースが使われている場合もあって難しいかなと思うのですが、
全然問題なし♪
例えば
件のリストの1行はスペースで区切られた9のフィールドと考えられますけど、その場合
$line="-rwxrwxr-x 2 53 53 4096 Feb 28 2006 include space 1.jpg";
@field = split(/\s+/, $line, 9);#フィールド数をしていすると、最後はまとめられる

print $field[8];# 9番目のフィールドにスペースがあっても大丈夫

QVBでのAPI

いつもお世話になっています。

今回初めて、APIを使うVBのプログラミングをしているんですが、サーバからのファイル名取得でつまずいています。
long型変数 = FtpFindFirstFile(セッション番号, ディレクトリパス, str型変数, 0, 0)
って感じで、何かしらファイルが存在するかどうかは戻り値で判定できるのですが、ファイル名自体が取得できません。(複数ファイルが存在するときは、どれか一つのファイル名が取得できれば問題ないです)
いろんなサイトを調べたのですが、「引数の文字列変数に"情報"が取得される」ようなふうに書かれており、はっきりしません。ちなみに私の作成中のPGでは、引数の文字列変数は何も格納なれない状態です。
どなたか詳しい方、教えてくれませんか?

Aベストアンサー

>「引数の文字列変数に"情報"が取得される」

FtpFindFirstFile()の第3引数はWIN32_FIND_DATA(のポインタ)だと思うのですが(^^;

http://vbvbvb.com/jp/gtips/0101/gFtpFindFirstFile.html
http://yokohama.cool.ne.jp/chokuto/urawaza/struct/WIN32_FIND_DATA.html
あたりが参考になると思います。

Qファイル時刻の変更直後の時刻取得

SetFileTime でファイル時刻を変更した直後にタスクを終了することなく GetFileTime でファイル時刻を取得するとなぜか変更内容が破棄されます。
タスクを終了すると変更内容が有効になっていますのでおそらくディスクキャッシュの影響とおもわれます。

関係情報・関係情報が記載されているコンパイルされたHTMLファイル・検索用シソーラス等お知らせ願えませんか。

プログラム作成環境
Visual Stiudio 6.0
Visual Basic SP5パッチ済
Windows 98SE 4.1

実行予定環境(作成時の障害の為現時点では実行経験なし)

Windows 95
Windows 98

Aベストアンサー

動作確認済みソースです。(EXCEL.VBAにて)
WinXPsp2
Excel2000sp3(VBA)
この環境では、Doeventsを利用しないでも、1日づつ日付が変更になりました。

OSによって違うのか、ソースに不具合があるか、実行して差を教えてください。



Option Explicit

Private Const DEF_FILE As String = "C:\テスト.txt"

' セキュリティを定義する構造体
Private Type SECURITY_ATTRIBUTES
  nLength       As Long
  lpSecurityDescriptor As Long
  bInheritHandle    As Long
End Type

' ファイルハンドルの値が無効であることを示す定数の宣言
Private Const INVALID_HANDLE_VALUE = (-1)

' オブジェクトへのアクセスの種類を指定する定数の宣言
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000

' ファイルへの動作を指定する定数の宣言
Private Const OPEN_EXISTING = 3

' ファイルなどの作成やオープンや切り捨てを行う関数の宣言
Private Declare Function CreateFile Lib "kernel32.dll" _
  Alias "CreateFileA" _
  (ByVal lpFileName As String, _
  ByVal dwDesiredAccess As Long, _
  ByVal dwShareMode As Long, _
  lpSecurityAttributes As SECURITY_ATTRIBUTES, _
  ByVal dwCreationDistribution As Long, _
  ByVal dwFlagsAndAttributes As Long, _
  ByVal hTemplateFile As Long) As Long

' オープンされているオブジェクトハンドルをクローズする
' 関数の宣言
Private Declare Function CloseHandle Lib "kernel32.dll" _
  (ByVal hObject As Long) As Long

' 日付と時刻を定義する構造体
Private Type SYSTEMTIME
  wYear     As Integer
  wMonth    As Integer
  wDayOfWeek  As Integer
  wDay     As Integer
  wHour     As Integer
  wMinute    As Integer
  wSecond    As Integer
  wMilliseconds As Integer
End Type

' ファイル時間を定義する構造体
Private Type FILETIME
  dwLowDateTime As Long
  dwHighDateTime As Long
End Type

' システム時間をファイル時間に変換する関数の宣言
Private Declare Function SystemTimeToFileTime Lib "kernel32.dll" _
  (lpSystemTime As SYSTEMTIME, _
  lpFileTime As FILETIME) As Long
' ファイル時間をシステム時間に変換する関数の宣言
Private Declare Function FileTimeToSystemTime Lib "kernel32.dll" _
  (lpFileTime As FILETIME, _
  lpSystemTime As SYSTEMTIME) As Long

' ファイルの作成日時などを設定する関数の宣言
Private Declare Function SetFileTime Lib "kernel32.dll" _
  (ByVal hFile As Long, _
  lpCreationTime As FILETIME, _
  lpLastAccessTime As FILETIME, _
  lpLastWriteTime As FILETIME) As Long

' ファイルの作成日時などを取得する関数の宣言
Private Declare Function GetFileTime Lib "kernel32.dll" _
  (ByVal hFile As Long, _
  lpCreationTime As FILETIME, _
  lpLastAccessTime As FILETIME, _
  lpLastWriteTime As FILETIME) As Long


Sub Test()
  Dim datTime As Date
  
  Debug.Print String(26, "-")
  
  '1回目取得
  Call funcGetTime(DEF_FILE, datTime)
  Debug.Print "1.取得" & datTime
  
  '1日引いて更新
  Call funcSetTime(DEF_FILE, datTime - 1)
  
  '2回目取得
  Call funcGetTime(DEF_FILE, datTime)
  Debug.Print "2.取得" & datTime

  Debug.Print String(26, "-")
End Sub

Private Function funcGetTime(ByVal inFile As String, ByRef otTime As Date) As Boolean
  Dim lngOpenFileHandle    As Long
  Dim udtCreationTime     As FILETIME
  Dim udtLastAccessTime    As FILETIME
  Dim udtLastWriteTime    As FILETIME

  'ファイルを取得モードでオープン
  If Not APICreateFile(inFile, False, lngOpenFileHandle) Then
    Exit Function
  End If
  
  ' ファイルの作成日時を取得
  Call GetFileTime(lngOpenFileHandle, _
          udtCreationTime, _
          udtLastAccessTime, _
          udtLastWriteTime)
  
  '【変換】ファイル時間→日付
  Call FileTime_To_Date(udtLastWriteTime, otTime)
  
  'ファイルをクローズ
  Call APICloseHandle(lngOpenFileHandle)
  
  funcGetTime = True
End Function

Private Function funcSetTime(ByVal inFile As String, ByVal inTime As Date) As Boolean
  Dim lngOpenFileHandle    As Long
  Dim udtCreationTime     As FILETIME
  Dim udtLastAccessTime    As FILETIME
  Dim udtLastWriteTime    As FILETIME

  'ファイルを更新モードでオープン
  If Not APICreateFile(inFile, True, lngOpenFileHandle) Then
    Exit Function
  End If
  
  ' ファイルハンドルの値が無効であるときは抜ける
  If lngOpenFileHandle = INVALID_HANDLE_VALUE Then
    Exit Function
  End If
    
  '【変換】日付→ファイル時間
  Call Date_To_FileTime(inTime, udtLastWriteTime)
  
  'ファイルの更新日時を設定
  Call SetFileTime( _
           lngOpenFileHandle _
          , udtCreationTime _
          , udtLastAccessTime _
          , udtLastWriteTime _
          )
          
  'ファイルをクローズ
  Call APICloseHandle(lngOpenFileHandle)
  
  funcSetTime = True
End Function

Private Sub APICloseHandle(ByRef inFileHandle As Long)
  If inFileHandle <> 0 Then
    Call CloseHandle(inFileHandle)
  End If
  inFileHandle = 0
End Sub

Private Function APICreateFile(ByVal inFile As String, ByVal inSetMode As Boolean, Optional ByRef otFileHandle As Long) As Boolean
  Dim udtSecurityAttributes  As SECURITY_ATTRIBUTES
  Dim lngOpenFileHandle    As Long
  
  '初期化
  Call APICloseHandle(otFileHandle)
  
  ' セキュリティ構造体を初期化
  udtSecurityAttributes.nLength = Len(udtSecurityAttributes)
  ' ファイルをオープン
  lngOpenFileHandle = _
    CreateFile(inFile, _
          IIf(inSetMode, GENERIC_WRITE, GENERIC_READ), _
          0, _
          udtSecurityAttributes, _
          OPEN_EXISTING, _
          0, _
          0)
  
  'ステータスチェック
  APICreateFile = Not (lngOpenFileHandle = INVALID_HANDLE_VALUE)
  If APICreateFile Then
    '正常ケースは、ハンドルを返す
    otFileHandle = lngOpenFileHandle
  End If

End Function

Private Sub Date_To_FileTime(ByVal inDate As Date, otFileTime As FILETIME)
  Dim udtSystemTime      As SYSTEMTIME
  
  '【変換】日付→システム時間
  With udtSystemTime
    .wYear = Year(inDate)
    .wMonth = Month(inDate)
    .wDay = Day(inDate)
    
    .wHour = Hour(inDate)
    .wMinute = Minute(inDate)
    .wSecond = Second(inDate)
    .wMilliseconds = 0
    .wDayOfWeek = Weekday(inDate) - 1
  End With
  
  '【変換】システム時間→ファイル時間
  Call SystemTimeToFileTime(udtSystemTime, otFileTime)
End Sub

Private Sub FileTime_To_Date(inFileTime As FILETIME, otDate As Date)
  Dim udtSystemTime      As SYSTEMTIME
  
  '【変換】ファイル時間→システム時間
  Call FileTimeToSystemTime(inFileTime, udtSystemTime)
  
  '【変換】システム時間→日付
  With udtSystemTime
    otDate = .wYear & "/" & .wMonth & "/" & .wDay & " " & .wHour & ":" & .wMinute & ":" & .wSecond
  End With
End Sub

動作確認済みソースです。(EXCEL.VBAにて)
WinXPsp2
Excel2000sp3(VBA)
この環境では、Doeventsを利用しないでも、1日づつ日付が変更になりました。

OSによって違うのか、ソースに不具合があるか、実行して差を教えてください。



Option Explicit

Private Const DEF_FILE As String = "C:\テスト.txt"

' セキュリティを定義する構造体
Private Type SECURITY_ATTRIBUTES
  nLength       As Long
  lpSecurityDescriptor As Long
  bInheritHandle    As Long
End Type
...続きを読む

QVB2008でFTPでのディレクトリー存在確認のやり方が分からない。

VB2008でFTP転送のブログラムを組んでいるのですが、ディレクトリーの存在確認のところで詰まっています。
ネット検索を行うと、下記記述が幾つか出てきますが、使い方、記述方法が分かりません。

if文を使い、FALSE か TRUEかで確認を行いたいと思っております。

ご存じの方がいらっしゃいましたらご教授下さいませ。
当方は初心者です。
宜しく御願い致します。

WebRequestMethods.Ftp.ListDirectory
WebRequestMethods.Ftp.ListDirectoryDetails

Aベストアンサー

一応、確認ですけど、FTPサーバー側のディレクトリ有無確認ですよね?
Directory.Exists(xxx) みたいのは無いんですねー

で、ちょっと調べてみましたが、@iITさんのところによさげなサンプルコードがありました。(大分下の方です。)
http://www.atmarkit.co.jp/fdotnet/dotnettips/763ftpdirexists/ftpdirexists.html

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBAでのファイル読込エラーの対応方法

VBAについては、かなり素人です。
エクセルのメインシートからバックグラウンドで任意のファイルを次のようなVBAで読み込んでいます。
次の場合では、存在しないファイル名等をセットすると「ファイル読込エラー」になります。「存在しないファイルが指定されています」等を表示し、Open命令では、ストップしないようにするには、どう記述すればいか教示願います。

PathName:任意のパス名
  CarentFile:任意のファイル名 
Application.ScreenUpdating = False
Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)

Aベストアンサー

Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)
の上下に、以下のように書き込んで下さい。


On Error Resume Next 'エラーがあっても続行する

Set ObjBook = Workbooks.Open(Filename:=PathName & "\" & CarentFile)

If Err.Number <> 0 Then 'エラーがあったら実行する
  MsgBox Error(Err.Number) 'エラー番号に相当するメッセージを表示
  Exit Sub 'マクロの実行を終了する
End If


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報