diff --git a/spec/std/file_spec.cr b/spec/std/file_spec.cr index 7caf379f24eb66543d85c81a528dc2da2c70fa8d..aaa4b52645f584c2393d442c814e125d88c9ca55 100755 --- a/spec/std/file_spec.cr +++ b/spec/std/file_spec.cr @@ -107,4 +107,23 @@ describe "File" do rescue Errno end end + + describe "size" do + assert { File.size("#{__DIR__}/data/test_file.txt").should eq(240) } + assert do + File.open("#{__DIR__}/data/test_file.txt", "r") do |file| + file.size.should eq(240) + end + end + end + + describe "cmp" do + it "compares two equal files" do + File.cmp("#{__DIR__}/data/test_file.txt", "#{__DIR__}/data/test_file.txt").should be_true + end + + it "compares two different files" do + File.cmp("#{__DIR__}/data/test_file.txt", "#{__DIR__}/data/test_file.ini").should be_false + end + end end diff --git a/src/file.cr b/src/file.cr index 0b66c5cc3ab2c05b70cbfd4522141b1953711255..0b4c43a51f21ba653c3153f9ee0c86e0fb37ffee 100644 --- a/src/file.cr +++ b/src/file.cr @@ -218,6 +218,38 @@ class File end end.compact.join('/') end + + def self.size(filename) + stat(filename).size + end + + def size + stat.size + end + + def self.cmp(filename1, filename2) + return false unless size(filename1) == size(filename2) + + File.open(filename1, "rb") do |file1| + File.open(filename2, "rb") do |file2| + compare_stream(file1, file2) + end + end + end + + def self.compare_stream(stream1, stream2) + buf1 :: UInt8[1024] + buf2 :: UInt8[1024] + + while true + read1 = stream1.read(buf1.buffer, 1024) + read2 = stream2.read(buf2.buffer, 1024) + + return false if read1 != read2 + return false if !buf1.buffer.memcmp(buf2.buffer, read1) + return true if read1 == 0 + end + end end def system2(command)