2017-11-25 192 views
-1

這是一個文本文件更名我做了,你把文件中的某些文件夾和程序重新命名他們FILE1.TXT,FILE2.TXT等紅寶石文件更名

它可以完成的工作,但它有兩個問題

  1. 它給了我這個錯誤no implicit conversion of nil into String error

  2. 如果我添加新的文件到那裏是已經組織文件的文件夾,它們都刪除,並創建新文件

是什麼導致了這些問題?

i=0 

Dir.chdir 'C:\Users\anon\Desktop\newfolder' 
arr = Dir.entries('C:\Users\anon\Desktop\newfolder') 

for i in 2..arr.count 
if (File.basename(arr[i]) == 'file'+((i-1).to_s)+'.txt') 
puts (arr[i]+' is already renamed to '+'file'+i.to_s) 
else 
File.rename(arr[i],'file'+((i-1).to_s)+'.txt') 
end 
end 

回答

0

你的程序有兩個主要問題。

首先是您在數組arr中使用了越界值。試試這個a = [1,2,3]; a[a.count],你會得到nil,因爲你是在訪問a[3]努力,但在數組中的最後一個元素的索引是2

然後,您使用作爲名稱fileINDEX.txt總是2...foobar指標而沒有考慮到一些指標可能已經在您的目錄中使用。

額外的問題,你正在使用Dir.entries,這在我的操作系統提供了更多的定期條目...應該妥善管理,他們不是你想要操縱。所以,我給你寫了一個小小的腳本,希望你覺得它可讀,對我來說很有用。你可以改進它! (我在Linux操作系統下)。

# Global var only to stress its importance 
$dir = "/home/p/tmp/t1" 

Dir.chdir($dir) 

# get list of files 
fnames = Dir.glob "*" 

# get the max index "fileINDEX.txt" already used in the directory 
takenIndexes = [] 
fnames.each do |f| 
    if f.match /^file(\d+).txt/ then takenIndexes.push $1.to_i; end 
end 

# get the first free index available 
firstFreeIndex = 1 
firstFreeIndex = (takenIndexes.max + 1) if takenIndexes.length > 0 

# get a range of fresh indexes for possible use 
idxs = firstFreeIndex..(firstFreeIndex + (fnames.length)) 
# i transform the range to list and reverse the order because i want 
# to use "pop" to get and remove them. 
idxs = idxs.to_a 
idxs.reverse! 

# rename the files needing to be renamed 
puts "--- Renamed files ----" 
fnames.each do |f| 
    # if file has already the wanted format then move to next iteration 
    next if f.match /^file\d+.txt/ 
    newName = "file" + idxs.pop.to_s + ".txt" 
    puts "rename: #{f} ---> #{newName}" 
    File.rename(f, newName) 
end