Проверка наличия файла/подпапки в папке

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tathagata
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 26.07.2004 (Пн) 14:56

Проверка наличия файла/подпапки в папке

Сообщение Tathagata » 11.10.2004 (Пн) 13:04

Подскажите, Господа по сабжу.
Глянул в API ничего там нет. :oops:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.10.2004 (Пн) 13:29

а команда DIR на что?

Tathagata
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 26.07.2004 (Пн) 14:56

Сообщение Tathagata » 11.10.2004 (Пн) 16:55

Konst_One писал(а):а команда DIR на что?


Через MS-DOS комманды гемморойно. Тем более что мне надо не список файлов а значение True|False

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.10.2004 (Пн) 16:58

:roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.10.2004 (Пн) 16:59

Код: Выделить всё
Dim b as Boolean
if Dir("c:\Temp\File1.Ext")<>"" then
    b=True
else
    b=False
end if

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.10.2004 (Пн) 17:34

GSerg писал(а)::roll:

Konst_One сам виноват - обозвал зачем-то функцию Dir командой...

И не устаю напоминать, что проверка If Len(...) быстрее, чем сравнение с пустой строкой.
Изображение

Tathagata
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 26.07.2004 (Пн) 14:56

Сообщение Tathagata » 12.10.2004 (Вт) 12:11

Konst_One писал(а):
Код: Выделить всё
Dim b as Boolean
if Dir("c:\Temp\File1.Ext")<>"" then
    b=True
else
    b=False
end if


Функция не работает без указания файла, а я не знаю какой файл лежит в директории. Кроме того, проверка должна обрабатываться в цикле, переходить от поддиректории к поддиректории и проверять наличие файлов.
Может через WMI можно как-то решить это?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.10.2004 (Вт) 12:25

If Len(Dir$("C:\Temp\*.doc")) = 0 Then ...

Код: Выделить всё
File$ = Dir$("C:\Dir1\*.*")
While Len(File$) > 0
  Debug.Print File$
  File$ = Dir$
Wend
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.10.2004 (Вт) 17:16

Tathagata писал(а):Функция не работает без указания файла, а я не знаю какой файл лежит в директории.

Работает - вторым параметром надо указать vbDirectory

Tathagata писал(а):Кроме того, проверка должна обрабатываться в цикле, переходить от поддиректории к поддиректории и проверять наличие файлов.

Без проблем. Сформулируй задачу пояснее - поможем.

Tathagata писал(а):Может через WMI можно как-то решить это?

А зачем? :shock:
Изображение

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.10.2004 (Ср) 12:46

Как, господа?! Ни одной API-функции?! :shock:
Так же не интересно! :lol:
Код: Выделить всё
Option Explicit

Private Declare Function PathIsDirectoryEmpty Lib "shlwapi.dll" Alias "PathIsDirectoryEmptyA" _
  (ByVal pszPath As String) As Long

Private Declare Function PathIsDirectory Lib "shlwapi.dll" Alias "PathIsDirectoryA" _
  (ByVal pszPath As String) As Long

Private Declare Function PathAddBackslash Lib "shlwapi.dll" Alias "PathAddBackslashA" _
  (ByVal pszPath As String) As Long

Const MAX_PATH = 260

Private Function AddBackslash(ByVal sPath As String) As String
'
On Error GoTo eRes

'//------------------------------------------------------------------------------------
  Dim lRes As Long
  Dim sBuffer As String
'//------------------------------------------------------------------------------------
    sBuffer = Left$(sPath & String(MAX_PATH, vbNullChar), MAX_PATH)
    lRes = PathAddBackslash(sBuffer)
    If lRes <> 0 Then
        AddBackslash = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
    End If

Exit Function
eRes:
  MsgBox Err.Description
End Function
Private Sub PrintDirInfo(sInitialPath As String)
'
On Error GoTo eRes

'//------------------------------------------------------------------------------------
  Dim sTmpPath As String, j As Long
  Dim sDirArray() As String, lArraySize As Long
  Dim sBuffer As String
'//------------------------------------------------------------------------------------

sBuffer = Left$(sInitialPath & String(MAX_PATH, vbNullChar), MAX_PATH)
If PathIsDirectory(sBuffer) Then
  If PathIsDirectoryEmpty(sBuffer) Then
    lstDirs.AddItem sInitialPath & " - Empty"
  Else
    lstDirs.AddItem sInitialPath & " - Not Empty!"
    sTmpPath = Dir(sInitialPath & "\*", vbDirectory)
    lArraySize = 0
    ReDim sDirArray(lArraySize)
    Do While Not sTmpPath = ""
      If sTmpPath <> "." And sTmpPath <> ".." Then
        lArraySize = lArraySize + 1
        ReDim Preserve sDirArray(lArraySize)
        sDirArray(lArraySize) = sTmpPath
      End If
      sTmpPath = Dir
      DoEvents
    Loop
    For j = 1 To lArraySize
      PrintDirInfo (AddBackslash(sInitialPath) & sDirArray(j))
      DoEvents
    Next
  End If
End If

Exit Sub
eRes:
  MsgBox Err.Description
  Stop
End Sub

Private Sub cmdTestPath_Click()
'
On Error GoTo eRes

'//------------------------------------------------------------------------------------
  Dim sInitialPath As String
''//------------------------------------------------------------------------------------

sInitialPath = "d:\temp1"
lstDirs.Clear
PrintDirInfo (AddBackslash(sInitialPath))

Exit Sub
eRes:
  MsgBox Err.Description
  Stop
End Sub

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.10.2004 (Ср) 14:44

Sedge писал(а):Как, господа?! Ни одной API-функции?! :shock:
Так же не интересно! :lol:

Нет, интереснее всего было бы использовать невидимые FileListBox и DirListBox...
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 14:47

Смеются тут... А я года два-три назад так и делал...
:)
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.10.2004 (Ср) 15:07

Надо же, как интересно тебе было жить :-D
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 15:26

Ага :) Вот раскопаю тот проект (в планах был mp3-органайзер) и покажу, ужаснетесь все :)
Как пересматриваю некоторые свои старые проекты, так стыдно становится :)
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.10.2004 (Ср) 15:41

alibek писал(а):Как пересматриваю некоторые свои старые проекты, так стыдно становится :)
Хороший знак - это значит, что твоя квалификация с тех пор повысилась.
Плохо, если просматриваешь старый проект и не находишь ничего, что можно было бы сделать лучше.
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 13.10.2004 (Ср) 18:06

alibek писал(а):так стыдно становится

Мне иногда тоже :oops:
Моду создают модоки, а распространяют модозвоны.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 14.10.2004 (Чт) 9:48

alibek писал(а):Ага :) Вот раскопаю тот проект (в планах был mp3-органайзер) и покажу, ужаснетесь все :)
Как пересматриваю некоторые свои старые проекты, так стыдно становится :)

ИМХО - нет Дао в том, чтобы стыдится программы, которая нормально работает, вне зависимости от того как эта самая нормальная работа достигается :wink:

Tathagata
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 26.07.2004 (Пн) 14:56

Сообщение Tathagata » 15.10.2004 (Пт) 9:08

Ситуация усложняется тем, что в конечном итоге требуется сопряжение VBScript и обработки написанной в 1С, а в 1С функции VB (не VBscript) не обрабатываются. Более того нет конструкции For Each. :( Поэтому Dir и API, применить не получилось.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.10.2004 (Пт) 9:20

Тогда твоя судьба использовать FSO.
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.10.2004 (Пт) 17:31

Tathagata писал(а):Ситуация усложняется тем, что в конечном итоге требуется сопряжение VBScript и обработки написанной в 1С, а в 1С функции VB (не VBscript) не обрабатываются. Более того нет конструкции For Each. :( Поэтому Dir и API, применить не получилось.

Как это нет?
Ты в корне не прав. Я ещё три года назад написал обработку для 1С "Печать бирок" и в ней как раз использовал поиск файлов в директории и поочерёдный перебор. Ты видимо плохо смотрел в синтакс-помощнике. :)
Код: Выделить всё
//********************************************
Процедура ПриОткрытии()
   Перем Наименование, НайденыйФайл,ИндикаторНачалаИмени, ИндикаторКонцаИмени;       
   Перем ФайлНеНайден, МаскаИмениФайла;
   СписокБирок.УдалитьВсе();   
   МаскаИмениФайла=Сред(ТоварНаим,1,Найти(ТоварНаим,"/")-3);
// Формируем список доступных бирок
// Установим Текущий каталог
   КаталогБирок="C:\Program Files\1Cv77\Db\Бирки";
   Фс.УстТекКаталог("C:\Program Files\1Cv77\Бирки");
// Обнулим переменные   
   Наименование="";           
   ИндикаторНачалаИмени=0;
   ИндикаторКонцаИмени=0;
   НайденыйФайл="";                           
   ФайлНеНайден=0;
// Найдём первый файл и добавим имя в список
   НайденыйФайл=ФС.НайтиПервыйФайл(МаскаИмениФайла+"*.mxl");
   Если НайденыйФайл="" тогда
      Предупреждение("Для данного товара """+ТоварНаим+"""ещё не создан файл бирок.");
                  ФайлНеНайден=1;
   КонецЕсли;
   ЧислоВхождений=0;
   ИндикаторНачалаИмени=Найти(НайденыйФайл,КаталогБирок);
   ИндикаторКонцаИмени=Найти(НайденыйФайл,".mxl");
   Наименование=Сред(НайденыйФайл,ИндикаторНачалаИмени,ИндикаторКонцаИмени-1);
   СписокБирок.ДобавитьЗначение(Наименование);
// Найдём остальные файлы и тоже добавим их в список   
       Пока ФайлНеНайден=0 цикл
         ИндикаторНачалаИмени=0;
         ИндикаторКонцаИмени=0;
         НайденыйФайл=ФС.НайтиСледующийФайл();
      // Если больше файлов в каталоге нет -- заканчиваем перебор файлов
         Если НайденыйФайл="" тогда
            ФайлНеНайден=1;
            Продолжить;
         КонецЕсли;
         ИндикаторНачалаИмени=Найти(НайденыйФайл,КаталогБирок);
         ИндикаторКонцаИмени=Найти(НайденыйФайл,".mxl");
         Наименование=Сред(НайденыйФайл,ИндикаторНачалаИмени,ИндикаторКонцаИмени-1);
         СписокБирок.ДобавитьЗначение(Наименование);
      КонецЦикла;                                                       
      // Отсортируем список
      СписокБирок.СортироватьПоПредставлению();
КонецПроцедуры

//********************************************

Нужные для тебя операторы:
Фс.УстТекКаталог - устанавливает текущий каталог (в VB Chdir)
ФС.НайтиПервыйФайл(МаскаИмениФайла+"*.mxl"); Маска может быть и в имени. (*.txt) (в VB Dir$("C:\*.txt"))
ФС.НайтиСледующийФайл() - получаем следующий в списке файл (в VB повторый Dir без параметров)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.10.2004 (Пт) 18:04

О, впервые увидел знаменитый язык 1С вживую...
:shock: :shock:


А почему там ".mxl", кстати? Опечатка? ;-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.10.2004 (Пт) 18:09

:shock: Дааааа........


А комментарии в стиле C++ - тонкое издевательство над последним...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.10.2004 (Пт) 18:22

GSerg писал(а):А комментарии в стиле C++ - тонкое издевательство над последним...
Ага, и точки с запятыми ;-)
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.10.2004 (Пт) 20:20

tyomitch писал(а):О, впервые увидел знаменитый язык 1С вживую...
:shock: :shock:

Хочешь ещё покажу? У меня его много... :)
А почему там ".mxl", кстати? Опечатка? ;-)

Да нет, просто у меня имя файла формировалось из наименования товара плюс расширение файлов-таблиц 1С и править лень было, кинул как есть. Таким образом у одного товара могло быть несколько бирок. :)
Последний раз редактировалось Ruslan Demidow 15.10.2004 (Пт) 20:27, всего редактировалось 1 раз.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.10.2004 (Пт) 20:23

GSerg писал(а)::shock: Дааааа........


А комментарии в стиле C++ - тонкое издевательство над последним...

А чего? Комментарии как коментарии. Или ты имел ввиду знак комментария?
Да и язык 1С языком ООП назвать трудно: там завёл переменную без объявления типа и она в течении работы процедуры может быть и объектом и просто содержать в себе какие-то данные... :)
Хотя в освоении прост до изнеможения. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.10.2004 (Пт) 20:24

tyomitch писал(а):
GSerg писал(а):А комментарии в стиле C++ - тонкое издевательство над последним...
Ага, и точки с запятыми ;-)

Без точки с запятой на конце - строка считается ошибочной и 1С ругается, вываливает ошибку.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 18.10.2004 (Пн) 10:02

Tathagata писал(а):Ситуация усложняется тем, что в конечном итоге требуется сопряжение VBScript и обработки написанной в 1С, а в 1С функции VB (не VBscript) не обрабатываются. Более того нет конструкции For Each. :( Поэтому Dir и API, применить не получилось.

Я не понял в чем проблема? 1С прекрасно понимает внешние компоненты, в том числе и написанные на VB. Сам недавно занимался подобной задачей. Правда компонент должен быть разработан по определенным правилам, которые детально описаны в документации по этой самой 1С. В инете тоже пара ссылок есть. Google тебе поможет.

ta_gena
Бывалый
Бывалый
 
Сообщения: 264
Зарегистрирован: 30.10.2002 (Ср) 12:18
Откуда: Russia

Сообщение ta_gena » 18.10.2004 (Пн) 14:59

Комментарии как в C и точка с запятой, это еще не все радости программирования на 1С. Я долго мучился, пока сообразил, что тело функции долно быть описано до ее первого использования. Поэтому главная процедура стоит самой последней. А наличие всего трех типов данны (строка, дата и число) принесет Вам множество сюрпризов и удовольствия при преобразованиях.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 18.10.2004 (Пн) 19:16

ta_gena писал(а):Комментарии как в C и точка с запятой, это еще не все радости программирования на 1С. Я долго мучился, пока сообразил, что тело функции долно быть описано до ее первого использования. Поэтому главная процедура стоит самой последней. А наличие всего трех типов данны (строка, дата и число) принесет Вам множество сюрпризов и удовольствия при преобразованиях.

Не всегда главная процедура обязательно должна быть последней в модуле: есть же дополнительная возможность описать функцию или процедуру раньше. Это например
Функция ПолучитьЧислоДокументов(параметры) Далее
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 19:22

Вот это форвардная :shock:

Даааа....
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 6

    TopList  
cron