Почему строка пути файла не разделяется - PullRequest
1 голос
/ 10 мая 2019

Я хочу найти файлы в каталоге, затем разделить путь и напечатать каждую часть пути в отдельной строке:

(Directory working: '.')
allFilesMatching: '*.st' do: [ :ff | (ff name)
    findTokens: '/'     "Linux separator"
    "splitOn: '/'        -this also does not work"   
    do: [ :i|
        i displayNl ]]

Однако выдается следующая ошибка:

$ gst firstline.st 
"Global garbage collection... done"
Object: '/home/abcd/firstline.st' error: did not understand #findTokens:do:
MessageNotUnderstood(Exception)>>signal (ExcHandling.st:254)
String(Object)>>doesNotUnderstand: #findTokens:do: (SysExcept.st:1448)
optimized [] in UndefinedObject>>executeStatements (firstline.st:3)
[] in Kernel.RecursiveFileWrapper(FilePath)>>filesMatching:do: (FilePath.st:903)
[] in Kernel.RecursiveFileWrapper>>namesDo:prefixLength: (VFS.st:378)
[] in File>>namesDo: (File.st:589)
BlockClosure>>ensure: (BlkClosure.st:268)
File>>namesDo: (File.st:586)
Kernel.RecursiveFileWrapper>>namesDo:prefixLength: (VFS.st:373)
Kernel.RecursiveFileWrapper>>namesDo: (VFS.st:396)
Kernel.RecursiveFileWrapper(FilePath)>>filesMatching:do: (FilePath.st:902)
File(FilePath)>>allFilesMatching:do: (FilePath.st:775)
Directory class>>allFilesMatching:do: (Directory.st:225)
UndefinedObject>>executeStatements (firstline.st:2)

Сообщение об ошибке действительно длинное и сложное!

И findTokens, и splitOn не работают.

Где проблема и как ее можно решить.

1 Ответ

1 голос
/ 10 мая 2019

Сообщение может быть длинным, но в строке указана причина:

Object: '/home/abcd/firstline.st' error: did not understand #findTokens:do

Возможно, вы хотите использовать разделение по-другому, возможно, используя subStrings: $character.Я только что попробовал это на GNU Smalltalk Windows версии:

Команда:

'C:\prg_sdk\GNU Smalltalk(x86)\share\smalltalk\unsupported\torture.st' subStrings: $\

Результат:

OrderedCollection ('C:' 'prg_sdk' 'GNU Smalltalk(x86)' 'share' 'smalltalk' 'unsupported' 'torture.st' )

Где вы получите свойпуть, когда у вас есть в коллекции.Вы начинаете либо с начала, либо с конца.

Например, вы можете начать с начала так:

resultPath := nil.
pathCollection := 'C:\prg_sdk\GNU Smalltalk(x86)\share\smalltalk\unsupported\torture.st' subStrings: $\.
pathCollection do: [ :eachPartPath |
     resultPath := (resultPath isNil) ifTrue: [
        eachPartPath
    ] ifFalse: [
        resultPath, '\', eachPartPath
    ].
    resultPath displayNl
]
...