Время(API)

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 11:32

Подскажите, как в VB 2008 получить время создания файла с помощью GETFILETIME? Если можно приведите пример.
Например файл "C:\1.txt"

Maxxx.!!!.
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 13.03.2006 (Пн) 17:10
Откуда: Барнаул

Re: Время(API)

Сообщение Maxxx.!!!. » 05.05.2009 (Вт) 11:48

Вот, нарыл примерчик:

Совет (или пример) от Дёмина Антона. Он посвящен временам файлов. Итак, у Вас есть файл, как узнать время его создания? Смотрите ниже приведённый код.

Код: Выделить всё
' Открывает указанный файл в режиме двоичного доступа.
' Эта функция необходима нам для получения доступа к датам файла и изменения их.
Declare Function lopen& Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long)
' Закрывает указанный файл.
Declare Function lclose& Lib "kernel32" Alias "_lclose" (ByVal hFile As Long)
Public Const READAPI = 0
Public Const WRITEAPI = 1
Public Const READ_WRITE = 2
' Получает информацию из указанного файла о дате времени.
' Аргументы lpCreationTime, lpLastAcccessTime и lpLastWriteTime могут быть
' установлены в ноль (тогда передайте эти аргументы ByVal As Long), если
' вам они не нужны. Дата возвращается этой функцией в формате UTC.
Declare Function GetFileTime& Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME)
' Устанавливает время создания, изменения и последнего доступа к файлу.
Declare Function SetFileTime& Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME)
' 64-битное число, указывающее на прошедшее время
' с 1 января 1601 г. с единицей измерения 100 наносекунд.
Type FILETIME ' 8 бит
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
' Записывает аргумент со структурой FILETIME
' во второй аргумент со структурой SYSTEMTIME.
Declare Function FileTimeToSystemTime& Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME)
' Записывает аргумент со структурой SYSTEMTIME
' во второй аргумент со структурой FILETIME.
Declare Function SystemTimeToFileTime& Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME)
' Эта структура содержит информацию о времени и дате.
Type SYSTEMTIME ' 16 бит
    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

А затем для работы всего этого нужно сделать следующие:
Sub Main()
    Dim lFileHwnd As Long
    Dim lDummy As Long
    Dim ftModified As FILETIME
    Dim ftCreated As FILETIME
    Dim ftAccessed As FILETIME
    Dim stCreated As SYSTEMTIME
    ' Поменяйте C:\AUTOEXEC.BAT на любой другой файл
    lFileHwnd = lopen("C:\AUTOEXEC.BAT", READ_WRITE)
    GetFileTime lFileHwnd, ftCreated, ftAccessed, ftModified
    FileTimeToSystemTime ftCreated, stCreated
    With stCreated
        Debug.Print .wDay & "." & .wMonth & "." & .wYear & ", " & .wHour & ":" & .wMinute & ":" & .wSecond & ":" & .wMilliseconds
    End With
    ' Увеличивает год создания файла на 5
    stCreated.wYear = stCreated.wYear + 5
     SystemTimeToFileTime stCreated, ftCreated
    SetFileTime lFileHwnd, ftCreated, ftAccessed, ftModified
    ' Проверка
    GetFileTime lFileHwnd, ftCreated, ftAccessed, ftModified
     FileTimeToSystemTime ftCreated, stCreated
    With stCreated
        Debug.Print .wDay & "." & .wMonth & "." & .wYear
    End With


P.S. Что-то я не понял, ты написал в VB2008, а этот форум про VB6, а VB2008 вообще не существует. Ты уж определись...
Никогда так не врут, как во время войны, после охоты и перед выборами...

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 11:52

Как это не существует???!!!
А Microsoft Visual Basic 2008 Express Edition?

Maxxx.!!!.
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 13.03.2006 (Пн) 17:10
Откуда: Барнаул

Re: Время(API)

Сообщение Maxxx.!!!. » 05.05.2009 (Вт) 11:58

Мля, отстал я от жизни что-то...
Никогда так не врут, как во время войны, после охоты и перед выборами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Время(API)

Сообщение Viper » 05.05.2009 (Вт) 12:58

Переехали в соответствующий раздел.
Пример от Maxxx.!!!. может быть использован и в VB 2008 с учеом того, что вместо типа Long в объявлениях необходимо использовать тип Integer.
Весь мир матрица, а мы в нем потоки байтов!

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 13:07

Код: Выделить всё
Public Structure FILETIME
        Dim dwLowDateTime As Integer
        Dim dwHighDateTime As Integer
End Structure

Public Structure WIN32_FIND_DATA
        Dim dwFileAttributes As Integer
        Dim ftCreationTime As FILETIME
        Dim ftLastAccessTime As FILETIME
        Dim ftLastWriteTime As FILETIME
        Dim nFileSizeHigh As Integer
        Dim nFileSizeLow As Integer
        Dim dwReserved0 As Integer
        Dim dwReserved1 As Integer
        Dim cFileName As String
        Dim cAlternate As String
End Structure

Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" _
ByVal lpFileName As String, ByVal lpFindFileData As WIN32_FIND_DATA) As Integer

For Each files In IO.Directory.GetFiles()
            Dim hfile as Integer
            Dim time As WIN32_FIND_DATA
            hfile=FindFirstFile(files, time)
Next
Скажите, где ошибка?
[Viper] :: Пользуемся тэгами CODE!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Время(API)

Сообщение iGrok » 05.05.2009 (Вт) 13:21

Sergey_next писал(а):Скажите, где ошибка?

Судя по всему, всё-таки в днк. Ты вообще понимаешь, что делает приведённый тобой код?
Точнее, что он, по-твоему, должен был бы делать, если бы был написан правильно?
label:
cli
jmp label

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Время(API)

Сообщение Viper » 05.05.2009 (Вт) 13:25

Ошибки видимо в попытке использования переменной типа FileInfo в качестве строки.
И вообще, зачем тебе в NET понадобилось использовать API для получения времени файла? Для этого можно использовать соответствующие методы класса File, например.
Весь мир матрица, а мы в нем потоки байтов!

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 13:57

For Each files In IO.Directory.GetFiles
ListBox1.Items.Add(files)
Next

For Each member In ListBox1.Items
TextBox3.Text = My.Computer.FileSystem.GetName(member)
Next

Файлов более 10000.
Когда я получаю имя файла, то это происходит почти мгновенно, а когда хочу получить время создания(File.GetCreationTime), то процесс длится несколько минут.

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 15:06

Не будет быстрее получить время создания с помощью API-функций?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Время(API)

Сообщение Viper » 05.05.2009 (Вт) 15:40

Sergey_next писал(а):Когда я получаю имя файла, то это происходит почти мгновенно, а когда хочу получить время создания(File.GetCreationTime), то процесс длится несколько минут.
Не верю! С другой стороны, имя файла у тебя есть, остается использовать его для API функций в которые ты пытался отправить объект FileInfo.
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Время(API)

Сообщение Viper » 05.05.2009 (Вт) 15:43

Sergey_next писал(а):
Код: Выделить всё
For Each files In IO.Directory.GetFiles
ListBox1.Items.Add(files)
Next

For Each member In ListBox1.Items
TextBox3.Text = My.Computer.FileSystem.GetName(member)
Next
Зачем двойную работу делаешь? Сразу получай имя файла или время его создания.
Весь мир матрица, а мы в нем потоки байтов!

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 05.05.2009 (Вт) 15:49

Ну ладно, можно и без двойной. Это я экспериментировал. Вот только время создания получаешь гораздо дольше, чем имя. :?:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Время(API)

Сообщение Viper » 06.05.2009 (Ср) 7:55

Интересно, почему у меня вот этот код:
Код: Выделить всё
Sub Main()
        Dim fl As FileInfo
        Dim di As New DirectoryInfo("C:\Temp")
        For Each fl In di.GetFiles()
            Console.WriteLine("{0}:{1})", fl.Name, fl.CreationTime)
        Next
End Sub
выполняется практически мгновенно?
Весь мир матрица, а мы в нем потоки байтов!

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 06.05.2009 (Ср) 8:23

10000 файлов находятся на удаленном сервере, с которым связь по каналу 2Мбит.

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: Время(API)

Сообщение Ronin » 06.05.2009 (Ср) 9:41

Сервис? =) :twisted:
С уважением,
Игорь Шувалов aka Ronin

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 06.05.2009 (Ср) 10:37

Какой сервис?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: Время(API)

Сообщение Ronin » 06.05.2009 (Ср) 11:01

WCF например. Если у тебя все упирается в ширину канала, то это лучшее решение.
На стороне сервера (там где хранилище) пишешь сервис используя WCF или Remoting, который получат от тебя запрос, находит все что нужно и отправляет назад. Типа такого =)
С уважением,
Игорь Шувалов aka Ronin

Sergey_next
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 23.03.2009 (Пн) 16:21

Re: Время(API)

Сообщение Sergey_next » 06.05.2009 (Ср) 11:04

Я уже думаю об этом...


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

    TopList