Ранее пользовался недокументированной утилитой xp_dirtree, но недавно столкнулся со сложностями её использования. Сначала она не хотела работать без всякого объяснения причин с расшаренной подпапкой вида \\ИМЯСЕРВЕРА\ИМЯРАСШАРЕННОЙПАПКИ\ИМЯПОДПАПКИ\ИМЯЕЩЁОДНОЙПОДПАПКИ. Как оказалось позже проблема оказалась в том, что пользователю, от имени которого работает сервис SQL сервера, были предоставлены права на конечную подпапку, но не были предоставлены права на вышележащую. С правами разобрались, хранимая процедура заработала, но спустя некоторое время возникла задача получения не просто списка файлов, а ещё и дат их создания, а эту информацию xp_dirtree не предоставляет. Пришлось воспользоваться процедурой xp_cmdshell и досовской командой dir. Вполне возможно, что вам это тоже пригодится:
/* Чтение списка файлов и папок в выбранном каталоге файловой системы с датой создания Автор: Васильев А.А. Дата создания/Последнего изменения: 21.03.2024/21.03.2024 exec usr_DirectoryListing 'f:\txt\TEMP', '0' exec usr_DirectoryListing 'f:\txt\TEMP\*.xml', '0' */ CREATE procedure usr_DirectoryListing @Directory nvarchar(100)='f:\txt', @ShowFilesOnly char(1)='1'--0=показать и файлы, и папки, 1=Только файлы as declare @DirCommand nvarchar(120) set @DirCommand='dir '+@Directory create table #dir (DirString nvarchar(500)) insert into #dir exec xp_cmdshell @DirCommand select convert(datetime,case left(DirString,2) when '01' then 'Jan' when '02' then 'Feb' when '03' then 'Mar' when '04' then 'Apr' when '05' then 'May' when '06' then 'Jun' when '07' then 'Jul' when '08' then 'Aug' when '09' then 'Sep' when '10' then 'Oct' when '11' then 'Nov' else 'Dec' end+space(1)+substring(DirString,4,2)+space(1)+substring(DirString,7,4)+space(1)+replace(substring(DirString,13,8),' ',''),0) as Created, case when substring(DirString,25,5)='<DIR>' then 'SubDir' else 'File' end as ObjType, substring(DirString,40,461) as NameOfFileOrSubDir, DirString from #dir where isnumeric(left(DirString,1))=1 and @ShowFilesOnly<=case when substring(DirString,25,5)='<DIR>' then 0 else 1 end order by Created desc drop table #dir
Не обращайте внимание на эту уродливую конструкцию:
convert(datetime,case left(DirString,2) when '01' then 'Jan' when '02' then 'Feb' when '03' then 'Mar' when '04' then 'Apr' when '05' then 'May' when '06' then 'Jun' when '07' then 'Jul' when '08' then 'Aug' when '09' then 'Sep' when '10' then 'Oct' when '11' then 'Nov' else 'Dec' end+space(1)+substring(DirString,4,2)+space(1)+substring(DirString,7,4)+space(1)+replace(substring(DirString,13,8),' ',''),0) as Created
Это пришлось сделать на скорую руку из-за настроек даты на сервере, у вас, возможно, дата будет в нормальном формате и все эти ужимки не понадобятся.