Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Дескриптор файла

Есть вот такой вопрос.
Можно в реалтайм отслеживать изменение файла в windows? 
Допустим есть share для пользователей и творят там свои мутные пользовательские дела
Позволяет ли NTFS как-то фиксировать, что появился новый файл или перезаписался.
Просто сканировать файловую систему по тайминга никак нельзя, вдруг там 100500 файлов
Вообщем, ткните меня в материал по теме  
   
Заранее спасибо
Дмитрий
Ответ:
FindFirstChangeNotification


так можно отслеживать изменения в конкретной папке. Чтобы отслеживать весь диск, надо рекурсивно повызывать эту функцию

Этот ответ добавлен с нового Винграда - 
Вопрос: Непонятное поведение времени в свойствах файла при копировании (ctime mtime atime).

Приветствую. Поймал интересный баг (фичу?).
В винде есть три временных параметра файла:
atime - время доступа к файлу (не важный параметр).
ctime - время создания дескриптора файла, т.е. время создания файла.
mtime - время модификации содержимого файла, и только содержимого.

Для простого примера:
1) Создаем папку c:\1
2) Создаем в ней любой файл. Все три времени у него одинаковы и показывают время создания файла. Что логично.
3) Создаем папку c:\2 и копируем в нее вышеуказанный файл из c:\1.
Смотрим параметры скопированного файла и видим что время создания (ctime) изменилось на время когда был скопирован файл. Так и должно быть.
(Именно копируем, при перемещении параметры времени не изменяются.)
4) Удаляем исходный файл в папке c:\1
5) И наконец, самое интересное: копируем файл из папки c:\2 в c:\1. Смотрим в параметры файла и видим что время создания изменилось на время, в которое
был создан файл в пункте 2) !!!! Т.е. оно не увеличилось (что было бы логично), а уменьшилось (откатилось)?!
Если между пунктами 4) и 5) ребутнуть комп, то глюк не воспроизводится.


Пока писал нашел более простой способ воспроизвести этот прикол: создать в любой папке файл, удалить его и затем снова создать файл в этой же
папки с таким же именем. Смотрим на время создания и видим время создания не второго файла, а первого!

Что это за глюк? Кеш? Или еще что-то?
Ничего не нагуглилось, может ключевые слова не те.
Ответ: Мммм на виндах старше 7 (xp, 2003) вижу аналогичную картину.
Вопрос: Строка без концевого пробела не выводится в файл

Здравствуйте! Наблюдаю странности с выводом в файл. Например, конструкция вида:
Windows Batch file
1
2
set var2=ERROR
ECHO Parametr=%var2% now is %time%>"d:\Program Files\smscontrol\status.log"
Нормально выведет указанную строку в файл.


А вот такая конструкция:
Windows Batch file
1
2
set var=0
ECHO 001 %time% %var%>"d:\Program Files\smscontrol\status.log"
В файл ничего не выведет, зато выведет на экран значение 001 12:23:43,49
Чтобы последний пример вывел строку в файл, нужно после %var% поставить пробел, а мне это не совсем подходит. Как избавиться от концевого пробела в строке? И почему практически в одинаковых действиях такие разные результаты?
Ответ: Upszn1449, у Вас значение переменной "var" равно 0, а цифры, одиночно расположенные без последующего пробельного символа перед символами перенаправления, воспринимаются как соответствующие дескрипторы потоков.

При раскрытии переменных получается такая команда:
Windows Batch file
echo 001 12:23:43,49 0>"D:\Program Files\smscontrol\status.log"
,
где 0 -- дескриптор стандартного потока ввода данных.

Поскольку таких данных у Вас нет, файл создаётся пустым, а результат выполнения команды "ECHO" выводится в консольное окно, так как отсутствует перенаправление в файл стандартного потока вывода данных с дескриптором 1.

Чтобы этого не происходило, в данном случае надо писать так:
Windows Batch file
1
2
set var=0
>"D:\Program Files\smscontrol\status.log" echo 001 %time% %var%
,
что будет интерпретировано как
Windows Batch file
echo 001 12:23:43,49 0 1>"D:\Program Files\smscontrol\status.log"
,
но уже без пробела после нуля.
Вопрос: Жесткий диск - суммарный объем файлов превышает объем в разы

Всем доброго дня.

История следующая - жесткий диск с 2мя разделами, один NTFS, другой HFS+. Конечная цель - объединить 2 раздела в 1 (NTFS) не потеряв информацию. В Paragon Disk Manager конвертнул я HFS+ в NTFS и теперь наблюдаю следующую картину:



т.е. суммарный объем файлов больше размера диска в несколько раз.

Файлы при этом не открываются (например, картинки в jpg). chkdsk с опцией \F работал пару дней в итоге сказал следующее:
  Обработано записей дополнительных атрибутов: 3875062.
  Обработано записей повторного анализа: 0.
Проверка индексов (этап 2 из 3)...
  Обработано записей индекса: 5374954.
Проверка индексов завершена.
  Проверено неиндексированных файлов: 0.
  Восстановлено неиндексированных файлов: 0.
Проверка дескрипторов безопасности (этап 3 из 3)...
  Обработано файловых SD/SID: 2671872.
Проверка дескрипторов безопасности завершена.
  Обработано файлов данных: 1351541.
Windows проверила файловую систему. Ошибок не обнаружено.

 330704864 КБ всего на диске.
 136667908 КБ в 1955196 файлах.
   1322876 КБ в 1351543 индексах.
         0 КБ в поврежденных секторах.
   5009060 КБ используется системой.
     16384 КБ занято под файл журнала.
 187705020 КБ свободно на диске.

Размер кластера:                   4096 байт.
Всего кластеров на диске:      82676216.
  46926255 кластеров на диске.

Есть возможность восстановить инфу, или фсе?
Ответ:
Damien
можно натравить R-Studio или подобные, где есть анализ по заголовкам определенных форматов. Раскидает JPG, DOC и т.д. по отдельным папкам.
Не пойму только, почему перераспределение с конвертацией проводилось без бэкапа хотя бы самых важных файлов? Подобные операции - всегда определенный риск.

Ну вы же знаете - "Бэкап делают только трусы".
Вопрос: Сообщение "Ошибка: Неверный дескриптор."

Здравствуйте, есть *.vbs файл который при запуске выдает ошибку Неверный дескриптор(Смотри рисунок)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
'******************************************************************
'* Имя: Interact.vbs
'* Язык: VBScript
'* Описание: Ввод/вывод строк в консольном режиме
'******************************************************************
Dim s
' Выводим строку на экран
WScript.StdOut.Write "Введите число: "
' Считываем строку
s = WScript.StdIn.ReadLine
' Выводим строку на экран
WScript.StdOut.WriteLine "Вы ввели число " & s
'************* Конец *********************************************
В чем проблема? Помогите пожалуйста
Ответ:
Сообщение от ar4ipers
'* Описание: Ввод/вывод строк в консольном режиме


VBS-скрипт с этим кодом может быть выполнен только при использовании сервера сценариев СScript.exe, а по умолчанию обычно используется сервер сценариев WScript.exe. Поэтому запускайте этот скрипт, используя пункт контекстного меню VBS-файла "Открыть в командной строке" (только, чтобы успеть увидеть результат выполнения, добавьте в конец кода строку
Visual Basic
WScript.Sleep 3000
),
или запускайте непосредственно из окна Командной строки, используя команду
Code
cscript //nologo "Путь к Вашему файлу\Ваш файл.vbs"
.
Вопрос: Странно работают вложенные условия в bat-файле

Доброго времени суток!
Вот решил обновить/подтянуть свои знание в области командной строки Windows. Прошел мат. часть и начал тренироваться с простых примеров, которые нашел в сети , и на первом же примере застопорился.
Пример:
Своя команда для создания новых файлов
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
REM Создание пустого файла, имя которого задано в строке запуска
if "%1" EQU "" goto error
copy nul %1
goto exit
:error
ECHO ОШИБКА: Необходимо задать имя нового файла !
:exit
Пример реализован через метки и переходы. Я же захотел реализовать его через if-then-else блоки(имхо так код выглядит более читабельно), реализовал, все работает, но после я захотел добавить еще одно условие проверки на существование файла с таким же именем, которое заданно для нового файла, реализовал, и вот что вышло:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
::Утилита создания нового файла из коммандной строки, имя файла задается параметром в командной строке.
@echo off
chcp 1251>nul
if exist %1 (echo Файл с таким именем уже существует!
) else (
if "%1"=="" (echo Не заданно имя для нового файла!
) else (
copy nul %1>nul
echo Создан файл: %1
))
И здесь тоже все прекрасно работает. Но вот, что-то мне в этих строках все не давало покоя и я понял, что это что-то выполнение условий, то есть как-то не красиво выходит, сначала мы вместо того, что выполнить проверку на ввели ли мы вообще имя нового файла(корректно ли введена команда), выполняем проверку на существование файла с таким именем, хотя по уму должно было бы наоборот, сначала проверка на корректность веденной команды, после проверка на существования файла, вообщем меняю я местами if-ы, вот так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
::Утилита создания нового файла из коммандной строки, имя файла задается параметром в командной строке.
@echo off
chcp 1251>nul
if "%1"=="" (echo Не заданно имя для нового файла!
) else (
if exist %1 (echo Файл с таким именем уже существует!
) else (
copy nul %1>nul
echo Создан файл: %1
))
И казалось бы нечего существенного не изменилось, но теперь bat-ник не проводит проверку на первое условие, то есть если я просто ввожу "nf" или "nf.bat" получаю:
Code
1
2
D:\bat\nf
Непредвиденное появление: else.
Во всем другом bat-ник работает, то есть проводит проверку на существования файла с таким именем и если файла таким именем не существует создает новый файл, а если существует выводит соответствующее сообщение.
Итак вопрос: почему так? Да, он и так работает, если не менять условия местами, но т.к. я занимаюсь этим в образовательных целях хочется докопаться до истины.
Ответ: ComSpec, большое спасибо за разъяснение, для себя выбрал варианты:
Windows Batch file
1
copy nul "%~1">nul
или с явным указанием дескриптора:
Windows Batch file
1
copy nul %1 1>nul
,
как наиболее стабильные и явные, как мне показалось, а там видно будет
Еще раз спасибо!
Вопрос: Копирование файлов с определёнными расширениями на сервер

Доброго времени суток, пытаюсь сделать скрипит копирования файлов по разрешениям на сервер я VBS изучать начал неделю назад и никак не могу понять, в чем я ошибся. Ошибка в 23 строчке подскажите, пожалуйста, что неправильно.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
Dim outFolder: outFolder = "C:\update"
Dim inFolder: inFolder = "\\server\"
Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim WSNetwork: Set WSNetwork = CreateObject("WScript.Network")
 
If oFSO.FolderExists(outFolder) AND oFSO.FolderExists(inFolder) Then
  CopyFileOnMask outFolder, "exe txt rar" ' каталог и маски файлов для удаления
  WScript.Echo "Готово."
Else
  WScript.Echo "Не найден один из путей " & outFolder & " " & "ИЛИ" & " " & inFolder
End If
WScript.Quit(0)
 
Function CopyFileOnMask(s, sMask)
  Dim oFld, arrMask, v, i
  Set oFld = oFSO.GetFolder(s)
  arrMask = Split(LCase(sMask), " ")
  For Each v In oFld.Files
    For i = LBound(arrMask) To UBound(arrMask)
      If LCase(oFSO.GetExtensionName(s & "\" & v.Name)) = arrMask(i) Then
        oFSO.CopyFile v, inFolder, True
        Exit For
      End If
    Next
  Next
End Function
Добавлено через 24 минуты
Немного переделал функцию наверное так правильнее
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function CopyFileOnMask(s, sMask)
  Dim oFld, iFld, arrMask, v, i
  Set oFld = oFSO.GetFolder(s)
  Set iFld = oFSO.GetFolder(inFolder)
  arrMask = Split(LCase(sMask), " ")
  For Each v In oFld.Files
    For i = LBound(arrMask) To UBound(arrMask)
      If LCase(oFSO.GetExtensionName(s & "\" & v.Name)) = arrMask(i) Then
        v.Copy (inFolder), True
        Exit For
      End If
    Next
  Next
End Function
Хотя все равно не помогло к сожалению
Ответ: Добрый день.
Помогите пожалуйста разобраться.

Скачала скрипт на сайте-

Я его немного хочу переделать.
Добавила условие- по типам файлов
В итоге из папки назначения- копируются только нужные файлы, а во вложенных папках- все типы файлов.
Помогите пожалуйста разобраться, в чём дело.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
' ========== Script Information  ==========
' script name:   Fail_Copying
' version:       1.0
' date:          14.08.12
' autor:         MasterLin
' site:          [url]http://www.masterlin.ru[/url]
' description:   Скрипт копирует файлы, папки и подпапки с одного источника на несколько, в сети или локально (рассылка файлов). 
' При этом происходит проверка на наличие, доступность и время создания файлов. При отсутствии, либо старой версии файла
' происходит его копирование и замена на более новый.
 
'***********************************************
' Создание объектов оболочки и файловой системы 
 
Set oShell = CreateObject("wscript.shell")
Set oFSO = CreateObject("Scripting.Filesystemobject")
Set WSNetwork = CreateObject("WScript.Network")
LogFolder = "f:\BackUp\2016\1" ' место расположения лог-файла
StartFolder = "f:\BackUp\2016\2" ' откуда копируем
aEndFolder = array("f:\BackUp\2016\1") ' куда копируем
 
' мой вариант
sMask= "txt doc docx xls"
Dim arrMask
'array("\\user1\1","\\user2\1") ' куда копируем 2 адреса 
arrMask = Split(LCase(sMask), " ")
' конец моего варианта
'***********************************************
' обнуление и описание счетчиков, используемых в скрипте
num_EndFolder = 0       '- общее число папок, места назначения для копируемых данных
num_EndFolder_0 = 0     '- не доступное кол-во папок из  num_EndFolder
num_files = 0           '- общее число обработанных файлов
num_files_copy = 0      '- из них скопировано с заменой на новую версию
err_files_copy = 0      '- из них не скопировано в результате ошибки при работе с num_files_copy
num_files_new = 0       '- из них скопировано новых файлов
err_files_new = 0       '- из них не скопировано в результате ошибки при работе с num_files_new
num_SubFolder = 0       '- обработано папок и подпапок
num_SubFolder_copy = 0  '- из них скопировано новых папок и подпапок
err_SubFolder = 0       '- из них не скопировано в результате ошибки при работе с num_SubFolder
 
'***********************************************
' Создание лог-файла
' Задаем имя лога
sLogName = "LogTemp_" & Date & "_" & Time
' Заменяем в имени все знаки на подчеркивания
sLogName = Replace(sLogName, ".", "_")
sLogName = Replace(sLogName, ":", "_")
sLogName = LogFolder & sLogName
' Создаем файл
Set oLogFile = oFSO.CreateTextFile(sLogName & ".log",true)
oLogFile.WriteLine "========== Script Information  ==========" & vbCrLf
oLogFile.WriteLine "script name:   Fail_Copying"
oLogFile.WriteLine "version:       1.0"
oLogFile.WriteLine "date:          10.08.12"
oLogFile.WriteLine "autor:         MasterLin"
oLogFile.WriteLine "site:          http://www.masterlin.ru" & vbCrLf
oLogFile.WriteLine "========== Запуск скрипта ==========" & vbCrLf
 
'***********************************************
 
Set oEndFolder = CreateObject("Scripting.FileSystemObject")
' Цикл для перебора папок "куда копируем"
For i=0 to UBound (aEndFolder)
' Счетчик кол-ва папок для копируемых данных
num_EndFolder=num_EndFolder+1
' Проверяем доступность папки, в которую хотим произвести копирование
If oEndFolder.FolderExists ( aEndFolder(i) ) Then 
    ' Записываем результат в лог
    oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " доступна для работы" & vbCrLf
    CopyFolder StartFolder,aEndFolder(i),"txt doc docx xls"
    ' Счетчик доступных для копирования папок
    ' удолил :)     
else
    ' Записываем результат в лог
    oLogFile.Writeline
    oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена." & vbCrLf
    ' Дублируем сообщение, выводом предупреждения на экран
    WScript.Echo "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена."
    ' Счетчик недоступных для копирования папок
    num_EndFolder_0=num_EndFolder_0+1
End if 'oEndFolder.FolderExists ( aEndFolder(i) ) Then 
Next
oLogFile.WriteLine "========== Отчет о копировании ==========" & vbCrLf
oLogFile.WriteLine "Было задано " & num_EndFolder & " папок, для копирования в них данных." 
oLogFile.WriteLine "Часть папок оказалась не доступна - " & num_EndFolder_0 & " шт. (см.логи выше)"
oLogFile.WriteLine "Скриптом было обработано - " & num_files & " файлов."
oLogFile.WriteLine "Из них скопировано с заменой - " & num_files_copy & " шт., не скопировано в результате ошибки - " & err_files_copy & " шт."
oLogFile.WriteLine "Из них скопировано новых файлов - " & num_files_new & " шт., не скопировано в результате ошибки - " & err_files_new & " шт."
oLogFile.WriteLine "Скриптом было обработано - " & num_SubFolder & " подпапок."
oLogFile.WriteLine "Из них скопировано новых подпапок - " & num_SubFolder_copy & " шт., не скопировано в результате ошибки - " & err_SubFolder & " шт."
oLogFile.WriteLine
oLogFile.WriteLine "========== Выполнение скрипта завершено ==========" & vbCrLf
WScript.Echo "Выполнение скрипта завершено."
 
WScript.Echo "Выполнение скрипта завершено."
 
'***********************************************************************************
Sub CopyFolder(sCopyFolder,sEndCopyFolder,sMask)
Dim a
' Создание объекта Folder
Set oFolder = oFSO.GetFolder(sCopyFolder) 'откуда 
Set oEndCopyFolder = oFSO.GetFolder(sEndCopyFolder)'куда
' Получение коллекции файлов
Set colFiles = oFolder.Files
 'WScript.Echo colFiles
 
 
' Обработка каждого файла из коллекции
For each oFile in colFiles
        wscript.Echo oFile.Name
' мой вариант
    ' цикл по массиву расширений (моё)
        For a = LBound(arrMask) To UBound(arrMask)
            If (LCase(oFSO.GetExtensionName(oFile.Name)) = arrMask(a)) Then
' конец моего варианта
            oLogFile.Writeline "Дата создания копируемого файла:"
            oLogFile.Writeline oFile & vbTab & oFile.DateCreated
            ' Счетчик числа проверяемых файлов
            num_files=num_files+1
            ' Проверяем существует уже такой файл в папке, если его нет, то копируем. 
            ' Если есть, то проверяем его актуальность и заменяем более новым, если он устарел.
            
            
            
            If oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then 
                'wscript.Echo oFSO.GetExtensionName(oFile)
                'wscript.Echo arrMask(a)
                ' Записываем результат в лог
                oLogFile.Writeline "Такой файл уже существует в папке " & oEndCopyFolder
                ' Проверяем насколько это свежая копия файла, для этого сравниваем даты создания двух файлов
                oLogFile.Writeline "Проверяем актуальность копии:"
                ' Выгружаем полный путь к проверяемому файлу
                sFileEnd = oFSO.BuildPath(oEndCopyFolder, oFile.Name)
                ' Создаем объект File, для работы с этим файлом
                    Set oFileEnd = oFSO.GetFile(sFileEnd)
                    ' Сравниваем даты изменения файлов 
                    If oFileEnd.DateLastModified < oFile.DateLastModified Then
                        ' Проверяемый файл оказался устаревшим, поэтому заменяем его более новым
                        oLogFile.Writeline "Копия файла устарела, заменяем его новым.     **********" & vbCrLf
                        oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
                        ' Проверка на наличие ошибок
                        if err.Number <> 0 then
                            ' Запись сообщения об ошибке в лог
                            oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                            ' Очистка ошибки
                            Err.Clear
                            ' Счетчик ошибок при замене файлов
                            err_files_copy=err_files_copy+1
                        else
                            ' Счетчик файлов, которые были заменены на новые
                            num_files_copy=num_files_copy+1             
                        End if 'err.Number <> 0 then
                    else
                        ' В этом случае копия прошла проверку, просто продолжаем работу скрипта далее
                        oLogFile.Writeline "Копия актуальна. Продолжаем работу." & vbCrLf
                    End if 'oFileEnd.DateLastModified < oFile.DateLastModified Then
            
            else
            
                ' Записываем результат в лог
                oLogFile.Writeline "Этот файл отсутствует в папке " & oEndCopyFolder & " Давайка его скопируем." & vbCrLf
                oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
                ' Проверка на наличие ошибок
                if err.Number <> 0 then
                    ' Запись сообщения об ошибке в лог
                    oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                    ' Очистка ошибки
                    Err.Clear
                    ' Счетчик ошибок при копировании новых файлов
                    err_files_new=err_files_copy+1
                else
                    ' Счетчик новых скопированных файлов
                    num_files_new=num_files_copy+1              
                End if 'err.Number <> 0 then
            
           End if 'oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then 
        End if '(LCase(oFSO.GetExtensionName(oFile)) = "TXT" Or LCase(oFSO.GetExtensionName(oFile)) = "xls") Then
Next
 
Next
 
' ********************************************************************************* 
 
' Проверяем все папки и подпапки
oLogFile.Writeline "Обрабатываем и копируем все подпапки из папки " & oEndCopyFolder & vbCrLf
' Получение коллекции подпапок
Set colSubFolders = oFolder.SubFolders
 
' Обработка каждой подпапки
For Each oSubFolder In colSubFolders
oLogFile.Writeline "Проверяем подпапку " & oSubFolder
    ' Счетчик обработанных папок и подпапок
    num_SubFolder=num_SubFolder+1   
    ' Проверяем существует уже такая подпапка в папке, если ее нет, то копируем. 
    ' Если есть, то переходим к проверке файлов в подпапке.
        If oFSO.FolderExists(oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path))) Then
        
        ' Записываем результат в лог
            oLogFile.Writeline "Такая подпапка уже существует в папке " & oEndCopyFolder
            oLogFile.Writeline "Проверяем все файлы в этой подпапке: "
            ' Выгружаем полный путь к проверяемоой подпапке
            sSubFolderEnd = oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path)) & "" 
            ' Производим рекурсивный вызов процедуры копирования файлов - программа вызывает сама себя
            
            CopyFolder oSubFolder, sSubFolderEnd, "txt doc docx xls"            
            ' oLogFile.Writeline
        else
            ' Записываем результат в лог            
            oLogFile.Writeline "Эта подпапка отсутствует в папке " & oEndCopyFolder & " Давайка ее скопируем." & vbCrLf
            oFSO.CopyFolder oSubFolder, sEndCopyFolder, True
            ' Проверка на наличие ошибок
            if err.Number <> 0 then
                ' Запись сообщения об ошибке в лог
                oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                ' Очистка ошибки
                Err.Clear
                ' Счетчик ошибок при копировании новых папок и подпапок
                err_SubFolder=err_SubFolder+1
            else
                ' Счетчик новых скопированных папок и подпапок
                num_SubFolder_copy=num_SubFolder_copy+1         
            End if 'err.Number <> 0 then
            
        End if  
    
Next
End Sub
'***********************************************

Объясните пожалуйста, как скопировать только файлы, с выбранным расширением во вложенных папках.
Вопрос: Кодировка имени файлов и папок

Здравствуйте. У меня вопрос связанный с кодировочными таблицами в операционных системах. Изрыл весь интернет по своему вопросу, 3 дня искал на разных поисковиках, ответа так и не нашёл, возможно кто-то из спецов здесь поможет в данном вопросе?

Windows XP/Vista/7 - в них я создаю файл/папку и первым-же делом машина мне присваивает на файл/папку имя ("Новая папка" или "Текстовый документ.txt") дальше уже меняешь имя как хочешь, т.е. ни файл ни папка вообще без имени существовать не могут.

Вопрос такой: в какой кодировке он мне прописал это русское имя созданной папки/файла? Например винда русская делает это в ASCII но если я создам папку/файл в Linux Ubuntu 14.04 с русским именем, то он мне должен русские символы создать в UTF-8, но как это проверить??? ведь в убунте может для русских автоматически тот-же ASCII использовать??? И проблема в том, что когда я всё это скину на USB-флешку и воткну её в др. систему, например Mac OS X у меня будет что-то вроде: лдвтлдмвы если конечно-же в Маке нет ASCII <- будет ли такое на самом деле?

И вообще, как проверить кодировку русских символов ? Например я хотел в какой нить оси (пусть даже portable или урезанной) найти её кодировочные таблицы, удалить все кроме UTF-8 (русской/китайской/корейской) и на ней я сразу бы знал что пишу я имя файла русскими символами из кодовой таблице UTF-8, вставив флешку с папками/файлами сразу бы увидел кракозябры которые могут быть чем угодно но не UTF-8 и *знал бы это* - своего рода получился бы детектор кодировок не utf8.

В поисках места нахождения кодировочных таблиц у windows xp понял что их там тупо нет! она использует псевдо-кодировку вытаскивая всякие символы из всяких там шрифтов так чтоб в итоге соответствовало кодовым стандартным таблицам, но самих таблиц нет.

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

Или может ли помочь какой нить дистрибутив который не знает ASCII будет писать русские имена файлов в utf? но тут ещё вопрос, мне нужен именно utf-8, не 16 не 32 не KOI*** а именно utf8.

Хочу называть файлы и папки русскими в перемешку с корейскими/китайскими символами (это будет перемешка utf8-русский/utf8-8-корейский/utf8-китайский), нужен мировой стандарт и лучше чем кодировку utf-8 для этого не нашёл.
Ответ: Вобщем, проблему я пока что так и не решил... Может кто подскажет что я сделал не так?

Напомню - вопрос в том, что нужно определить кодировку в именах файлах и папок в маздае (Windows) интересует исключительно UTF-8 а не всякие cp-1251, cp-1252 (+расширенная), koi8-r и прочая маздаевская фигня т.к. написав имена файлов и папок в винде русскими символами в других системах будут каракули а UTF-8 считается как мировой эталон и определится нормально в любой среде (если у неё есть русская лаколизация)...

Я сделал следующее: Установил Ubuntu 14.04 на USB-HDD, загрузился с неё, просмотрел список установленных локалей командой: locale -a

удалил лишние локали кроме интересующих меня английской.utf8 и русской.utf8 командой: sudo locale-gen --purge en_US.utf8 ru_RU.utf8 && echo "Success!"

сново проверил удалилось ли ненужное: locale -a

он мне выдал: С.UTF8
en_US.UTF8
POSIX
ru_RU.UTF8
т.е. всё казалось бы нормально.... (и тут Остапа понесло)... Подключаю HDD с маздаем (или монтирую ntfs, неважно), открываю... а там - ВСЁ НОРМАЛЬНО!!! --- КАК??? Я удалил все русские локали кроме UTF8 RUS.

Винда имена файлов пишет в 1251 или кои8? Убунту не должна была прочитать правильно эти русские виндовские шрифты т.к. я 1251 и кои8 локали УДАЛИЛ!!! а убунта их видет правильно (мне нужны были кракозябры!) а так получается что Windosw XP SP3 имена файлов и папок пишет мне в UTF8 ???? Иначе как объяснить это явление?

Решил попробовать другой момент, в Тотал Коммандоре у меня стоит плагин (Транслятор) в котором я русские имена файлов и папок переделываю в UTF8 и он мне их тут-же переименовывает в каракули, но когда я гружу Ubuntu то она эти каракули так-же видет как и винда - не распознаёт, КАК??? на убунте же Ru-UTF8 локаль стоит!!! Что за бред? Выходит что мне Тоталовский транслятор переименовывает не в UTF8 (саму кодировку) а в бредятину как оно бы отображалось если бы у меня винда не понимала бы UTF8 ???

Вобщем вопрос: так и не понят, почему Убунту, имеющая только русский утф8 отлично распознаёт виндовский русский (или винда мне их уже в утф8 катает или в убунте что-то не удалено)

Для доказательства того, что локаль правильно отображается внутри файла я в тегах .ogg и .mp3 написал коменты на русском (в винде), убунта распознала русский тег в .ogg нормально т.к. по "паспорту" в .ogg теги заносятся с кодировкой UTF8 а вот .mp3 показала мне убунта каракули (как и должно быть, т.к. мп3-теги в утф16 кодировки а я её в убунте удалил) Но вот почему сами имена файлов и папок русские написаные в маздае продолжают распознаваться в Убунте - я не могу понять. Если есть у кого идеи - отпишитесь...
Вопрос: Перемещение всех файлов с подпапок в корневую директорию, перемещение обратно

Здравствуйте, немного предыстории: у человека потерялись файлы на флэшке, я занялся их восстановлением, на свою голову нашёл занятие на выходные (язык мой - враг мой), большинство было Word'всяких документов 3х форматов doc, docx и TMP, папок на этой флешке просто очень много, да к тому же и в каждой папке есть файлы и подпапки - я с 12 часов успел только 4 папки обработать с подпапками полностью. 1) Могу ли я Вас, уважаемые жители форума, попросить написать BAT файл, который все файлы в подпапках скопирует в один каталог, откуда программе по восстановлению будет удобнее сканировать файлы?
Программа тоже хитро устроена, каждый файл после восстановления она кидает в
Код Code
1
[Папка в которую будут скидываться восстановленные файлы]\[<название документа>.<расширение которое было у файла до восстановления>]\<название документа>.doc
(то есть имена, за исключением расширения сохраняются такими какими были) - но думаю 1й батник и с этим справится
!Но в некоторых папках всё-же могут попасться одинаковые файлы - особенно файлы TMP - они же временные, так что в каждой папке они почти одинаково называются и номеруются - например: xWRL1208.TMP
2) Нужен батник, который сравнивает две папки на наличие файлов <filename>.<*> и если в папке 1 есть такой файл, которого нет в папке 2, то такой файл переносится в папку 1/Не восстановленно.
---
Это относится к 1-му батнику - В подпапках папки 1 могут присутсвовать папки с названием "Открываютя" - нужно их игнорировать.
Ответ: Ваш подход с восстановлением в корне неверный.

Каждое обращение к флеш-накопителю уменьшает шансы на успешное восстановление.
Происходит размагничивание. Работать нужно с образом. Потратите час, ну может, 2 времени.

Цитата Сообщение от Drink
Создайте образ флешки в файл, например, в DMDE: запустить, нажать Отмена, потом Сервис - Копировать секторы - где Источник - выбрать Диск - выбрать флешку, где Место для записи - выбрать ФАЙЛ (!), сохранить в директории на жд. Будет образ (файл), с которым работайте. Сделайте его копию. Этот файл и открывайте в программах восстановления, которые это позволяют. Внимательнее с dmde, не перепутайте диски.

Потом попробуйте recuva free с этой флешкой, для начала.
Вопрос: Запуск программы по событию создания файла

Здравствуйте значит так есть программа которая ну совсем ни как не подключена к БД и подключению не подлежит.
С помощью этой программа бухгалтер создаёт файл 2 раза каждый день.
Опишу схему того как всё работает сейчас.
P.S.Внутри программы есть настройка в которой можно выбрать место сохранения файл и имя файла может это как-то поможет вам мне подсказать. =)
Действия:
1) Бухгалтер включает программу создаёт файл
2) Бухгалтер звонит программисту чтобы тот запустил процедуру которая находит этот файл и данные из этого фала заносит в БД отсылка к теме (Чтение данных из внешнего файла)
3) После отработки процедуры программист звонит бухгалтеру и говорит что данные залиты.
4) Бухгалтер снова включает программу создаёт тот же файл, но уже с другими данными
(так как разные счета банков) (объединить эти счета в один файл нельзя так как программа при формирование файла заменяет тот файл который был (сделать один файл с двумя счетами сразу тоже нельзя так как в программе такого не предусмотрено, сменить путь сохранения можно НО! бухгалтера этому не обучить так что вариант отпадает да и к тому же каждый день менять по два раза путь сохранения бред)
5) После того как 2 раз файл создался старый фал затёрся.
6) Бухгалтер звонит программисту чтобы тот запустил процедуру
7) После отработки процедуры программист звонит бухгалтеру и говорит что данные залиты
8) Конец.

Добавлено через 6 минут
Так вот я по напридумывал какой-то совсем невероятный вариант...
В общем как сделать так чтобы при создание файл это пункт "1)" в описание задачи система понимала что файл создался и сама запускала эту процедуру.
Вариант того как я хочу:
1) Бухгалтер включает программу создаёт файл.
2) Система поняла "Ага создали файл">>>Запуск процедуры она работает ну секунд 5 (за это время бухгалтер не успеет создать другой файл)
3) Бухгалтер включает программу создаёт файл.
4) Система поняла "Ага создали файл">>>Запуск процедуры
5) Конец.
Чтобы исключить эти звонки =)) надоело уже.

P.S Windows XP; База Oracle (последняя версия.) да да XP не смейтесь. Х_ы
Ответ: Мне кажется, мало отследить создание файла. Надо отследить закрытие файла. А то при отслеживании возможно попасть в ситуацию, что файл уже создан, но запись в него ещё не закончена.