2014-07-18 28 views
0

我有一个包含数以万计的文件的Windows目录。我需要将所有独特的文件扩展名列表放入变量中。将独特的文件扩展名扫描到一个变量

在一个java程序中,我想遍历该目录(递归地包括所有子目录)并检索可以放入变量的唯一文件扩展名列表。

例如:Dir包含:File1.txt File2.doc File3.doc File4.doc File5.ppt 我想检索“txt,doc,ppt”并将其放入字符串变量中(它们不必可以用任何类型的数组分隔 - 尽管这可以起作用,但我只需要以上面的字符串结尾)。

有反正我可以做到这一点吗?可能通过访问命令行或使用正则表达式?

+1

请分享您的代码,并让我们知道您卡在哪里。有2件事涉及1)寻找所有目录和文件夹2)正则表达式匹配文件名。 – Braj

+1

你有没有试过'String.endsWith()'方法。 – Braj

回答

1

这里是一个Java 8示例

final String extensions = Files.walk(Paths.get("")) 
      .map(Path::toString) 
      .filter(pathString -> pathString.contains(".")) 
      .map(pathString -> pathString.substring(pathString.lastIndexOf('.') + 1, pathString.length())) 
      .distinct() 
      .collect(Collectors.joining(",")); 

    System.out.println(extensions); 
0

这里分批溶液:

del %temp%\x.x 2>nul 
for /f "tokens=*" %%i in ('dir /s /b /a-d *') do (find "%%~xi" %temp%\x.x ||<nul set/p .= %~xi>>x.x) 
set /p ext=<%temp%\x.x 
set ext=%ext:.=,% 
set ext=%ext:~1% 
echo %ext% 
+0

问题明确指出'在Java程序中'。 -1 – EJP

+2

@EJP:问题明确指出“可能通过访问命令行”同样给出标签“cmd”。 – Stephan

0

对于cmd(批处理文件)溶液

@echo off 

    setlocal enableextensions 
    for /r "%cd%" %%a in (*) do if not defined "\%%~xa\" (echo(%%~xa&set ""\%%~xa\"=1") 
    endlocal 

这将使用环境通过为每个变量设置一个变量来存储可视扩展的信息。如果未设置该变量,则这是第一次找到扩展并将其回传给控制台。

编辑适应评论和OP,我有误读。输出需要在只有一条线

@echo off 

    setlocal enableextensions 
    for /r "%cd%" %%a in (*.*) do if not defined "\%%~xa\" (
     set ""\%%~xa\"=1" 
     if not defined "\" (set ""\"=1") else (<nul set /p ".=,") 
     <nul set /p ".=%%~xa" 
    ) 
    endlocal 

相同的工作,以前的代码,但在这种情况下,输出在一个线keept用逗号加入需要的元素在扩展列表分开时

编辑正确格式化输出:删除扩展点和数据存储在变量中

@echo off 

    setlocal enableextensions disabledelayedexpansion 

    for /f "delims=" %%z in ('cmd /e:on /v:off /q /c "for /r "%cd%" %%a in (*.*) do if not defined "\%%~xa\" (set ""\%%~xa\"^=1" & if not defined "\" (set ""\"^=1") else (<nul set /p ".^=^,") & <nul set /p ".^=%%~xa")"') do set "extensionList=%%z" 
    set "extensionList=%extensionList:.=%" 
    echo(%extensionList% 

    endlocal 

仍然相同的代码,但要获得的变量内的数据时,所有先前的逻辑高电平在for命令中移动,因此可以将以前版本的列表分配给变量。然后点从该变量中删除,以获得所需的输出。

+1

OP希望他们在一个字符串中:“txt,doc,ppt”,而不是单行。除此之外,很好的解决方案(没有临时文件)。 – Stephan

+0

@Stephan,谢谢,我错过了这部分问题。 –

+0

嗯。如何删除点?变量在哪里以备后用? – Stephan

相关问题