Страницы: 1
RSS
Удалить файлы со спец-символами в названии с помощью VBA, При передачи названия файла в переменную символы заменяются на ??
 
Добрый день!
Возникла проблема с удалением файлов, содержащих в названии символы unicode. Например: Армения_1994_25 դր.jpg
Когда название файла с помощью strFileName = Dir передаётся  в переменную, то оно превращается в Армения_1994_25 ??.jpg
И соответственно, когда я пытаюсь его удалить командой Kill  вылетает ошибка, т.к. файла с вопросами в названии в папке нет.
Как можно обойти эту проблему? Может возможно обойтись здесь без переменной, которая искажает имя файла?

Код ниже урезан, вообще нужно выборочно файлы удалить, но тут упрощен до удаления  всех файлов
Код
1
2
3
4
5
6
7
8
9
10
11
Dim strDirPath, strMaskSearch, strFileName As String
strDirPath = "D:/Test1/" 'Папка поиска
strMaskSearch = "*.jpg*" 'Маска поиска
  
'Получаем первый файл соответствующий шаблону
strFileName = Dir(strDirPath & strMaskSearch)
  
Do While strFileName <> "" 'До тех пор пока файлы "не закончатся"
    Kill strDirPath & strFileName
    strFileName = Dir 'Следующий файл
Loop
 
Код
1
2
3
sub DelJPG
  kill "d:\test1\*.jpg"
end sub
а слэш поверните как Вам удобно)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Нет, такой способ не подходит. Я специально оговорку сделал! Нужно не всё  удалить, а только определенные файлы. Просто код урезал. Вообще код сверяет каждый найденный файл со списком ID, который должен содержаться в имени jpg файла (цифры в конце после последнего знака подчёркивания). Если в имени содержится ID, то файл нужно удалить. Если нет - то оставить.
Как это сделать?
Изменено: veery_good - 26.09.2016 09:39:10
 
Как-то не верю что "оно превращается"... Как определяли?
 
Цитата
Hugo написал: Как-то не верю что "оно превращается"... Как определяли?
Запускал код. Несколько первых файлов, без таких символов, удалились. Дальше - ошибка. Смотрю значение переменной при отладке - там имя с вопросительными знаками вместо символов валюты.
 
Цитата
veery_good написал:
Смотрю значение переменной при отладке
а Вы смотрите код каждого символа, а не сам символ визуально.
 
Так ведь удаление не работает, значит то, что я вижу визуально соответствует действительности. Файлы без символов դր удаляются, как только очередь доходит до файла с этими символами в названии - возникает ошибка. Попробуйте сами - убедитесь, что действительно имя файла искажается.
 
Мнда, и впрямь в переменной знаки вопроса после DIR()...
А вот FSO коды выводит верно:

А|1040
р|1088
м|1084
е|1077
н|1085
и|1080
я|1103
_|95
1|49
9|57
9|57
4|52
_|95
2|50
5|53
|32
?|1380
?|1408
.|46
j|106
p|112
g|103

Но Kill всё равно удалять файл не хочет...

P.S. А так удаляет:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub tt()
Dim FSO, i
Dim TheFolder, TheFiles, AFile
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TheFolder = FSO.GetFolder("C:\Downloads\")
Set TheFiles = TheFolder.Files
For Each AFile In TheFiles
    If UCase(FSO.GetExtensionName(AFile.Path)) = "JPG" Then
        If InStr(AFile, "_25") Then
    'For i = 1 To Len(AFile)
    'Debug.Print Mid(AFile, i, 1) & "|" & AscW(Mid(AFile, i, 1))
    'Next
    AFile.Delete
'Kill AFile 'не работает!
End If
    End If
Next
End Sub
Изменено: Hugo - 26.09.2016 12:21:30
 
Супер! Такого рода решение я и искал. Большое спасибо!
 
Ещё раз хотел бы вернуться к теме. Т.к. у меня очень много файлов (несколько сотен тысяч) и, соответственно, большой список на удаления (тоже больше ста тысяч), то указанный способ поиска в имени файла ID работает ооочень долго.
Я вообще ID стал вытаскивать только потому, что думал, что нельзя без искажения достать из ячеек имя файла полностью.
Но в итоге нашел значительно более быстрый способ, где не нужно прибегать к переменной:
Код
1
2
3
4
5
6
Sub DelFiles()
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
FSO.DeleteFile "C:\Temp\" & ActiveSheet.Range("A1").Value
End Sub
Страницы: 1
Читают тему
Loading...