【问题标题】:R: get a list of short file names (filenames) for all files in a directoryR:获取目录中所有文件的短文件名(文件名)列表
【发布时间】:2019-04-30 20:30:04
【问题描述】:

问题

list.files(Path) 返回目录Path 中文件名的向量。这很好,但我需要一个短文件名 (SFN) 向量。例如,WageDataFile.csv 的 SFN 是 WAGEDA~1.csv(如果目录中没有其他文件的词干为“WageDa”)。 SFN 也称为 8.3 文件名。

所需的解决方案

具体来说,我希望有一个函数可以从操作系统中提取 SFN,而不是从 list.files() 的输出中重建它(但也欢迎从 list.files() 的输出中重建 SFN 的方法)。

可重现案例的代码

这将在“E:/FileNameTest”创建一组具有可变名称长度的文件:

setwd("E:/FileNameTest")
library(stringi)
nFiles = 12
minNameLength = 2
maxNameLength = 12
set.seed(1)
FileNames = 
    stri_rand_strings(nFiles, 
                length=sample(minNameLength:maxNameLength,nFiles,replace=T), 
                '[A-Za-z0-9]')
file.create(FileNames)

这里是FileNames的内容:

 [1] "lUizNmvDe7"   "GN0Nr"        "LTbUBpfn"     "6i"           "Poe"          "mYWm1Tjg"    
 [7] "TrRF46JWfPuI" "SKe"          "FTl5sLqLKTtr" "OmxQ"         "iO"           "KkCi7F" 

这是我需要从这些文件名中获得的 SFN 列表(编辑:缩短的名称应全部大写):

[1] "6i"       "FTL5SL~1" "GN0Nr"    "iO"       "KkCi7F"   "LTbUBpfn" "LUIZNM~1" "mYWm1Tjg" "OmxQ"    
[10] "Poe"      "SKe"      "TRRF46~1"

【问题讨论】:

  • 这似乎是 Windows 特定的东西。 R 试图对操作系统不敏感。您可以从 Windows dir shell 命令:shell("dir /x") 获取短名称。但是为什么你需要短名称呢?
  • 我需要读取数千个文件的文本,这些文件的名称对于 Windows 文件路径来说太长了。 readLines() 不适用于长路径。已针对此问题提出的解决方案包括创建指向该目录的虚拟驱动器,但实际上我有数千个目录要通过,并且为所有目录创建虚拟驱动器似乎比仅使用 SFN 更糟糕的解决方案每个文件。另一种解决方案可能是用另一个平台重命名文件,但名称包含我需要的数据。
  • 可以关闭短名称,您应该只处理空格。在 8.3 名称中,空格在技术上是可能的。
  • @Anders 你的意思是可以增加 Windows 文件名的字符限制(使用“启用 NTFS 长路径”策略)吗?我不确定您所说的空间有什么问题。
  • 不,我的意思是可以关闭 8.3 名称,当您这样做时,您只会得到长名称,不存在“...~1”名称。如果你对空格没有问题,为什么你首先要关心短名称?

标签: r windows directory filenames short-filenames


【解决方案1】:

这是一个解决方案(基于 MrFlick 的评论),它可能依赖于对 dir 输出的无效假设。具体来说,我假设输出的页眉和页脚总是分别占 5 行和 2 行,并且dir /x/a:-d 输出中的字段宽度始终是恒定的。

library(stringr)
FileList = shell("dir /x/a:-d", intern=T)
FileList = FileList[6:(length(FileList)-2)]
SFN = str_replace(str_sub(FileList, 39, 46), "        ", "")
Name = str_sub(FileList, 52, -1)
NameList = ifelse(str_length(SFN)>0, SFN, Name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多