[quote="liyu212"] 1. require 'ftools'
- # assume all paths in destdirs are valid directories
- def copy_all(srcdir, destdirs)
- Dir.entries(srcdir)[2..-1].each_with_index do |fname, idx|
- Dir.mkdir(dir = File.join(destdirs[idx / 1000], (idx + 1).to_s))
- File.copy File.join(srcdir, fname), File.join(dir, fname)
- end
- end
- # change the paths here, or take them
- # from command line arguments (ARGV)
- srcdir = './src'
- destdirs = (1..8).map {|i| "./dest/#{i}000"}
- # copy the files
- copy_all srcdir, destdirs
destdirs[idx / 1000],这个代码有什么作用呢?
还有,如果我提前不知道srcdir文件夹中的文件个数,该怎么完善这个程序呢?[/quote]
首先destdirs是我给copy_all设的一个参数,它期待接受的是含有所有可用的输出目录路径的一个数组。
为了保持代码的灵活性,我没有把1000..8000那8个目录的路径直接写在copy_all里,而是在调用copy_all时从外部传入那些路径名。传进去的数组内容是这样组装出来的:
[code="ruby"]destdirs = (1..8).map {|i| "./dest/#{i}000"}
#=> ["./dest/1000", "./dest/2000", "./dest/3000", "./dest/4000", "./dest/5000", "./dest/6000", "./dest/7000", "./dest/8000"][/code]
也就是说,传进去的数组的第一个元素(下标为0那个)就是"./dest/1000"。
而遍历srcdir文件夹里的内容时,Dir.entries返回的是包括"."和".."在内的所有文件和子文件夹。忽略掉"."和".."后,调用each_with_index,在block里的idx就可以获得文件的序号(从0开始)。那么头1000个文件的序号就是0到999。这些数字除以1000都等于0,正好从destdirs数组里就找到对应的下标的那个路径,也就是你问的destdirs[idx / 1000]。
这段代码我因为懒所以少做了些检查,本来最好是检查一下fname对应的是不是文件,类似:
[code="ruby"]fpath = File.join(srcdir, fname)
File.file? fpath[/code]
另外,反正用到了ftools,新建目录的时候可能用File.mkpath会好一点(上面的代码里用的是Dir.mkdir)。
然后如果你要在copy_all里直接生成那些目标目录(1000...8000那些),那可以像这样:
[code="ruby"]require 'ftools'
参数:
srcdir : 要拷贝的文件所在的文件夹
destdir : 要拷贝的文件的目标文件夹
file_per_dir : 目标目录里每个文件夹要放多少个文件
def copy_all(srcdir, destdir, file_per_dir)
# 得到srcdir目录下的所有文件,不包括子文件夹及子文件夹里的文件
# 下面几行都可以写在一行上,这里只是为了看起来方便所以换行了
entries = Dir.entries(srcdir).
map {|f| File.join srcdir, f }.
select {|f| File.file? f }
# 得到文件夹的数目
len = entries.length
dir_count = len / file_per_dir +
((len % file_per_dir == 0) ? 0 : 1)
# 得到分组的目标文件夹
destdirs = (1..dir_count).
map {|i| File.join destdir, (i * file_per_dir).to_s }
# 创建这些目标文件夹
destdirs.each {|d| File.mkpath d }
# 拷贝文件……
entries.each_with_index do |fpath, idx|
dir = File.join destdirs[idx / file_per_dir], (idx + 1).to_s
File.mkpath dir
File.copy fpath, File.join(dir, File.basename(fpath))
end
end
类似这样来调用
copy_all './src', './dest', 10[/code]
反正根据你自己的需要来改吧~