Страницы: 1
RSS
адрес файла на фтп с неизвестной переменной
 
Добрый день, подскажите как можно импортировать с фтп файл с неизветным окончанием названия файла.  
Dim strPath, strDt, strFile as String  
strPath = "ftp://10.10.4.3/public/"  
strDt = InputBox("Введите дату проверки в формате YYYYMMDD", , 20120627)  
strFile = strPath & "file1.txt_" & strDt & "_2130" & "%%"  
 
и последние цифры "%%" могут быть не известны, кто нибудь знает как сделать?
 
А вы скажите, как бы вы делали это вручную (будь у вас только браузер)  
А мы тогда подскажем, как вашу идею воплотить в виде кода.  
 
Без этих неизвестных цифр, файл не скачивается?  
Когда придумаете, как обойти эти цифры, воспользуйтесь моим решением для загрузки файла из интернета (с Web-сервера, или через FTP):  
http://excelvba.ru/code/DownloadFile   
http://excelvba.ru/tools/FTP
 
Идея в том, чтобы автоматически открывался ексель смотрел папку на фтп и брал нужный файл (суть в том что название файла строится на имени файла даты и времени выгрузки с секундами, и секунды всегда разные), поэтому сложность возникла только с выбором файла...  
я это представляю как цикл просмотра файлов в папке по маске(имяФайла_Date_2130), но как это сделать пока не понимаю
 
Я бы сделал так:  
 
Взяв за основу модуль класса из http://excelvba.ru/tools/FTP  
дописал бы туда функцию, возвращающую массив имён файлов, найденных в заданной папке:  
 
Function FilesFromFolder(ByVal FtpFolder$, Optional ByVal Mask$ = "*")  
   On Error Resume Next: Kill TMP_FILE_PATH$  
   folder$ = Replace(BaseFolder & FtpFolder$, "//", "/")  
   If Right(folder$, 1) <> "/" Then folder$ = folder$ & "/"  
 
   TXT_DIR$ = "user " & Login & " " & Password & vbNewLine  
   TXT_DIR$ = TXT_DIR$ & "cd " & folder$ & vbNewLine  
   TXT_DIR$ = TXT_DIR$ & "ls " & Mask$ & " """ & TMP_FILE_PATH$ & """" & vbNewLine  
   TXT_DIR$ = TXT_DIR$ & "close" & vbNewLine & "bye" & vbNewLine  
 
   res$ = Execute(TXT_DIR$)  
   'ChangeFileCharset TMP_FILE_PATH$, "Windows-1251", "CP866"  
   FilesFromFolder = ReadTXTfile(TMP_FILE_PATH$)  
   Kill TMP_FILE_PATH$  
   While Right(FilesFromFolder, 2) = vbNewLine: FilesFromFolder = Left(FilesFromFolder, Len(FilesFromFolder) - 2): Wend  
   FilesFromFolder = Split(FilesFromFolder, vbNewLine)  
End Function  
 
 
 
Ну а потом уже работал бы с полученным массивом имен:  
 
Sub test()  
   On Error Resume Next  
   strDt = InputBox("Введите дату проверки в формате YYYYMMDD", , 20120627)  
   strFile = strPath & "file1.txt_" & strDt  
 
 
   Dim FTP As New FTPcommander  
   ' загружаем с FTP список файлов  
   arr = FTP.FilesFromFolder(WEB_FOLDER$, strFile & "*")  
     
   ' перебираем имена файлов в массиве  
   For i = LBound(arr) To UBound(arr)  
       MsgBox "Найден подходящий файл: " & vbNewLine & arr(i)  
   Next i  
     
   Set FTP = Nothing  
End Sub
 
Может так - можно как скрипт.vbs использовать, можно как макрос:  
 
 
Dim FSO  
Dim TheFolder, TheFiles, AFile  
strPath = "ftp://10.10.4.3/public/"  
strDt = InputBox("Введите дату проверки в формате YYYYMMDD", , 20120627)  
strFile = strPath & "file1.txt_" & strDt & "_2130" & "%%"  
 
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set TheFolder = FSO.GetFolder(strPath) 'Каталог  
Set TheFiles = TheFolder.Files  
 
For Each AFile In TheFiles  
  If UCase(FSO.GetExtensionName(AFile.Path)) = "TXT_" & strDt & "_2130" & "*" Then AFile.Delete  
Next  
 
Строка  
strFile = strPath & "file1.txt_" & strDt & "_2130" & "%%"  
совершенно лишняя... :)  
Хотя, если там есть аналогичные файлы, но не "file1" - тогда из неё "file1" нужно как-то в код прикрутить...  
Т.е. проверяем расширение и одновременно имя файла.
 
EducatedFool, выдает ошибку на шаге folder$ = Replace(BaseFolder & FtpFolder$, "//", "/")  
 
Я правильно задаю значения фтп?  
 
Private Sub Class_Initialize()  
   ' из реестра - значения по-умолчанию  
   Me.Host = GetSetting(Application.Name, "FTP", "Host", "ftp://10.10.4.3")  
   Me.Login = GetSetting(Application.Name, "FTP", "Login", "anonymous")  
   Me.Password = GetSetting(Application.Name, "FTP", "Password", "guest")  
   Me.BaseFolder = GetSetting(Application.Name, "FTP", "BaseFolder", "/public/")  
   Me.BaseURL = GetSetting(Application.Name, "FTP", "BaseURL", "ftp://10.10.4.3/public/")  
End Sub
 
Hugo, при указание ссылки на Set TheFolder = FSO.GetFolder(strPath) ошибка Path not faund, как макрос точно можно использовать?
 
Я так с ftp такой код не использовал, только локально, так что точно не скажу.  
И проверить нет возможности...
 
да, локально работает, а с фтп выдает ошибку. В любом случае спасибо, код полезный, может быть в будущем пригодится
 
решил проблему тем, что беру файлы из шары человека, а не с фтп, но интересно было бы иметь возможность брать файлы с фтп
Страницы: 1
Наверх