sys-filesystem 0.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +35 -0
- data/MANIFEST +13 -0
- data/README +82 -0
- data/Rakefile +95 -0
- data/examples/example_stat.rb +24 -0
- data/lib/sys/filesystem.rb +408 -0
- data/sys-filesystem.gemspec +25 -0
- data/test/test_sys_filesystem.rb +9 -0
- data/test/test_sys_filesystem_unix.rb +248 -0
- data/test/test_sys_filesystem_windows.rb +198 -0
- metadata +85 -0
data/CHANGES
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
== 0.3.2 - 29-Dec-2009
|
2
|
+
* Source has been moved to github.
|
3
|
+
* Added the 'gem' task and removed build logic from the gemspec.
|
4
|
+
* Updated the install task.
|
5
|
+
* Minor correction to the manifest.
|
6
|
+
* Removed some junk build files that were inadvertently included in
|
7
|
+
the last gem.
|
8
|
+
|
9
|
+
== 0.3.1 - 5-Aug-2009
|
10
|
+
* Now compatible with Ruby 1.9.x.
|
11
|
+
* Changed license to Artistic 2.0
|
12
|
+
* Updated the gemspec, including the explicit addition of a license and
|
13
|
+
test-unit as a development dependency, as well as an updated description.
|
14
|
+
|
15
|
+
== 0.3.0 - 26-Feb-2009
|
16
|
+
* Added support for OS X and FreeBSD thanks to an awesome patch by Nobuyoshi
|
17
|
+
Miyokawa.
|
18
|
+
* Added the Filesystem.mount_point method that takes a file and returns
|
19
|
+
the mount point it's sitting on.
|
20
|
+
|
21
|
+
== 0.2.0 - 30-Dec-2008
|
22
|
+
* Added the Filesystem.mounts method for iterating over mount or volume
|
23
|
+
information.
|
24
|
+
|
25
|
+
== 0.1.1 - 28-Mar-2007
|
26
|
+
* Bug fix for BSD flavors. Thanks go to Jeremy Kemper and Ole Christian
|
27
|
+
Rynning for the spot.
|
28
|
+
* Bug fix for OS X (along the same lines as the BSD fix). Thanks go to
|
29
|
+
Aurelian Dehay for the spot.
|
30
|
+
* Some Rdoc improvements for the C extension.
|
31
|
+
* Tweaks to the gemspec.
|
32
|
+
* Added synopsis to the README.
|
33
|
+
|
34
|
+
== 0.1.0 - 17-Nov-2006
|
35
|
+
* Initial release. Alpha. Code is stable, but API is not.
|
data/MANIFEST
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
* MANIFEST
|
2
|
+
* CHANGES
|
3
|
+
* Rakefile
|
4
|
+
* README
|
5
|
+
* sys-fileystem.gemspec
|
6
|
+
* examples/example_stat.rb
|
7
|
+
* doc/sys-filesystem.txt
|
8
|
+
* ext/extconf.rb
|
9
|
+
* ext/sys/filesystem.c
|
10
|
+
* lib/sys/filesystem.rb
|
11
|
+
* test/test_sys_filesystem.rb
|
12
|
+
* test/test_sys_filesystem_unix
|
13
|
+
* test/test_sys_filesystem_windows
|
data/README
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
= Description
|
2
|
+
A Ruby interface for getting file system information.
|
3
|
+
|
4
|
+
= Prerequisites
|
5
|
+
=== MS Windows
|
6
|
+
* windows-pr, 0.9.8 or later.
|
7
|
+
|
8
|
+
= Installation
|
9
|
+
rake test (optional)
|
10
|
+
rake install (non-gem) OR rake install_gem (gem)
|
11
|
+
|
12
|
+
= Synopsis
|
13
|
+
require 'sys/filesystem'
|
14
|
+
include Sys
|
15
|
+
|
16
|
+
# Display information about a particular filesystem.
|
17
|
+
p Filesystem.stat('/')
|
18
|
+
|
19
|
+
# Sample output
|
20
|
+
|
21
|
+
#<Sys::Filesystem::Stat:0x517440
|
22
|
+
@base_type = "ufs",
|
23
|
+
@flags = 4,
|
24
|
+
@files_available = 3817457,
|
25
|
+
@block_size = 8192,
|
26
|
+
@blocks_available = 19957633,
|
27
|
+
@blocks = 34349612,
|
28
|
+
@name_max = 255,
|
29
|
+
@path = "/",
|
30
|
+
@filesystem_id = 35651592,
|
31
|
+
@files = 4135040,
|
32
|
+
@fragment_size = 1024,
|
33
|
+
@files_free = 3817457,
|
34
|
+
@blocks_free = 20301129
|
35
|
+
>
|
36
|
+
|
37
|
+
# Describe all mount points on the system
|
38
|
+
Filesystem.mounts{ |mount| p mount }
|
39
|
+
|
40
|
+
# Find the mount point of any particular file
|
41
|
+
puts Filesystem.mount_point('/home/djberge/some_file.txt') => '/home'
|
42
|
+
|
43
|
+
= Notes
|
44
|
+
=== MS Windows
|
45
|
+
This is a pure Ruby implementation using the windows-pr library, which in
|
46
|
+
turn wraps native Windows functions.
|
47
|
+
=== UNIX
|
48
|
+
This is a C extension that wraps statvfs, etc.
|
49
|
+
|
50
|
+
= Sample code
|
51
|
+
Run 'rake example' if you want to see a basic sample run. The actual code
|
52
|
+
is 'example_stat.rb' in the 'examples' directory. Modify it as you see fit.
|
53
|
+
|
54
|
+
= Known Bugs
|
55
|
+
None that I'm aware of. Please report bugs on the project page at
|
56
|
+
http://www.rubyforge.org/projects/sysutils.
|
57
|
+
|
58
|
+
= Future Plans
|
59
|
+
Suggestions welcome.
|
60
|
+
|
61
|
+
= Acknowledgements
|
62
|
+
Mike Hall, for ideas and code that I borrowed from his 'filesystem'
|
63
|
+
library.
|
64
|
+
|
65
|
+
Park Heesob, for implementation and API ideas for the MS Windows version.
|
66
|
+
|
67
|
+
Nobuyoshi Miyokawa, for adding FreeBSD and OS X support.
|
68
|
+
|
69
|
+
= License
|
70
|
+
Artistic 2.0
|
71
|
+
|
72
|
+
= Copyright
|
73
|
+
(C) 2003-2009 Daniel J. Berger
|
74
|
+
All Rights Reserved
|
75
|
+
|
76
|
+
= Warranty
|
77
|
+
This library is provided "as is" and without any express or
|
78
|
+
implied warranties, including, without limitation, the implied
|
79
|
+
warranties of merchantability and fitness for a particular purpose.
|
80
|
+
|
81
|
+
= Author
|
82
|
+
Daniel J. Berger
|
data/Rakefile
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/testtask'
|
4
|
+
include Config
|
5
|
+
|
6
|
+
desc "Clean the build files for the sys-filesystem source for UNIX systems"
|
7
|
+
task :clean do |task|
|
8
|
+
Dir.chdir('examples') do
|
9
|
+
FileUtils.rm_rf('sys') if File.exists?('sys')
|
10
|
+
end
|
11
|
+
|
12
|
+
unless Config::CONFIG['host_os'] =~ /mswin32|mingw|cygwin|windows|dos/i
|
13
|
+
file = 'sys/filesystem.' + CONFIG['DLEXT']
|
14
|
+
Dir.chdir('ext') do
|
15
|
+
sh 'make distclean' rescue nil
|
16
|
+
rm file if File.exists?(file)
|
17
|
+
rm_rf 'conftest.dSYM' if File.exists?('conftest.dSYM') # OS X weirdness
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Build the sys-filesystem library on UNIX systems (but don't install it)"
|
23
|
+
task :build => [:clean] do
|
24
|
+
unless Config::CONFIG['host_os'] =~ /mswin32|mingw|cygwin|windows|dos/i
|
25
|
+
file = 'filesystem.' + CONFIG['DLEXT']
|
26
|
+
Dir.chdir('ext') do
|
27
|
+
ruby 'extconf.rb'
|
28
|
+
sh 'make'
|
29
|
+
mv file, 'sys'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Install the sys-filesystem library"
|
35
|
+
task :install do
|
36
|
+
unless Config::CONFIG['host_os'] =~ /mswin32|mingw|cygwin|windows|dos/i
|
37
|
+
install_dir = File.join(CONFIG['sitelibdir'], 'sys')
|
38
|
+
Dir.mkdir(install_dir) unless File.exists?(install_dir)
|
39
|
+
FileUtils.cp('lib/sys/filesystem.rb', install_dir, :verbose => true)
|
40
|
+
else
|
41
|
+
task :install => :build
|
42
|
+
Dir.chdir('ext') do
|
43
|
+
sh 'make install'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Run the test suite"
|
49
|
+
Rake::TestTask.new("test") do |t|
|
50
|
+
unless Config::CONFIG['host_os'] =~ /mswin32|mingw|cygwin|windows|dos/i
|
51
|
+
task :test => :build
|
52
|
+
t.libs << 'ext'
|
53
|
+
t.libs.delete('lib')
|
54
|
+
end
|
55
|
+
|
56
|
+
t.warning = true
|
57
|
+
t.verbose = true
|
58
|
+
t.test_files = FileList['test/test_sys_filesystem.rb']
|
59
|
+
end
|
60
|
+
|
61
|
+
task :test do
|
62
|
+
Rake.application[:clean].execute
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Run the example program"
|
66
|
+
task :example => [:build] do |t|
|
67
|
+
Dir.chdir('examples') do
|
68
|
+
Dir.mkdir('sys') unless File.exists?('sys')
|
69
|
+
end
|
70
|
+
|
71
|
+
FileUtils.cp('ext/sys/filesystem.' + Config::CONFIG['DLEXT'], 'examples/sys')
|
72
|
+
|
73
|
+
Dir.chdir('examples') do
|
74
|
+
ruby 'example_stat.rb'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
desc "Build a gem"
|
79
|
+
task :gem => [:clean] do |t|
|
80
|
+
spec = eval(IO.read('sys-filesystem.gemspec'))
|
81
|
+
|
82
|
+
if Config::CONFIG['host_os'] =~ /mswin32|mingw|cygwin|windows|dos/i
|
83
|
+
spec.required_ruby_version = '>= 1.8.2'
|
84
|
+
spec.files -= Dir['ext/**/*']
|
85
|
+
spec.platform = Gem::Platform::CURRENT
|
86
|
+
spec.add_dependency('windows-pr', '>= 1.0.5')
|
87
|
+
else
|
88
|
+
spec.required_ruby_version = '>= 1.8.0'
|
89
|
+
spec.extensions = ['ext/extconf.rb']
|
90
|
+
spec.files -= Dir['lib/**/*']
|
91
|
+
spec.extra_rdoc_files << 'ext/sys/filesystem.c'
|
92
|
+
end
|
93
|
+
|
94
|
+
Gem::Builder.new(spec).build
|
95
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
######################################################################
|
2
|
+
# example_stat.rb
|
3
|
+
#
|
4
|
+
# Example program that demonstrates the FileSystem.stat method.
|
5
|
+
# Use the 'rake example' task to run this program.
|
6
|
+
######################################################################
|
7
|
+
require 'sys/filesystem'
|
8
|
+
include Sys
|
9
|
+
|
10
|
+
p Filesystem::VERSION
|
11
|
+
|
12
|
+
stat = Filesystem.stat("/")
|
13
|
+
puts "Path: " + stat.path
|
14
|
+
puts "Block size: " + stat.block_size.to_s
|
15
|
+
puts "Fragment size: " + stat.fragment_size.to_s
|
16
|
+
puts "Blocks free: " + stat.blocks_free.to_s
|
17
|
+
puts "Blocks available: " + stat.blocks_available.to_s
|
18
|
+
puts "Files/Inodes: " + stat.files.to_s
|
19
|
+
puts "Files/Inodes free: " + stat.files_free.to_s
|
20
|
+
puts "Files/Inodes available: " + stat.files_available.to_s
|
21
|
+
puts "File system id: " + stat.filesystem_id.to_s
|
22
|
+
puts "Base type: " + stat.base_type if stat.base_type
|
23
|
+
puts "Flags: " + stat.flags.to_s
|
24
|
+
puts "Name max: " + stat.name_max.to_s
|
@@ -0,0 +1,408 @@
|
|
1
|
+
require 'windows/error'
|
2
|
+
require 'windows/path'
|
3
|
+
require 'windows/filesystem'
|
4
|
+
require 'windows/volume'
|
5
|
+
require 'windows/handle'
|
6
|
+
require 'windows/limits'
|
7
|
+
require 'socket'
|
8
|
+
require 'win32ole'
|
9
|
+
require 'date'
|
10
|
+
require 'time'
|
11
|
+
|
12
|
+
# The Sys module serves as a namespace only.
|
13
|
+
module Sys
|
14
|
+
|
15
|
+
# The Filesystem class encapsulates information about your filesystem.
|
16
|
+
class Filesystem
|
17
|
+
include Windows::Error
|
18
|
+
include Windows::Handle
|
19
|
+
include Windows::Limits
|
20
|
+
|
21
|
+
extend Windows::Error
|
22
|
+
extend Windows::FileSystem
|
23
|
+
extend Windows::Volume
|
24
|
+
extend Windows::Path
|
25
|
+
|
26
|
+
# Error typically raised if any of the Sys::Filesystem methods fail.
|
27
|
+
class Error < StandardError; end
|
28
|
+
|
29
|
+
CASE_SENSITIVE_SEARCH = 0x00000001
|
30
|
+
CASE_PRESERVED_NAMES = 0x00000002
|
31
|
+
UNICODE_ON_DISK = 0x00000004
|
32
|
+
PERSISTENT_ACLS = 0x00000008
|
33
|
+
FILE_COMPRESSION = 0x00000010
|
34
|
+
VOLUME_QUOTAS = 0x00000020
|
35
|
+
SUPPORTS_SPARSE_FILES = 0x00000040
|
36
|
+
SUPPORTS_REPARSE_POINTS = 0x00000080
|
37
|
+
SUPPORTS_REMOTE_STORAGE = 0x00000100
|
38
|
+
VOLUME_IS_COMPRESSED = 0x00008000
|
39
|
+
SUPPORTS_OBJECT_IDS = 0x00010000
|
40
|
+
SUPPORTS_ENCRYPTION = 0x00020000
|
41
|
+
NAMED_STREAMS = 0x00040000
|
42
|
+
READ_ONLY_VOLUME = 0x00080000
|
43
|
+
|
44
|
+
# The version of the sys-filesystem library.
|
45
|
+
VERSION = '0.3.2'
|
46
|
+
|
47
|
+
class Mount
|
48
|
+
# The name of the volume. This is the device mapping.
|
49
|
+
attr_reader :name
|
50
|
+
|
51
|
+
# The last time the volume was mounted. For MS Windows this equates
|
52
|
+
# to your system's boot time.
|
53
|
+
attr_reader :mount_time
|
54
|
+
|
55
|
+
# The type of mount, e.g. NTFS, UDF, etc.
|
56
|
+
attr_reader :mount_type
|
57
|
+
|
58
|
+
# The volume mount point, e.g. 'C:\'
|
59
|
+
attr_reader :mount_point
|
60
|
+
|
61
|
+
# Various comma separated options that reflect the volume's features
|
62
|
+
attr_reader :options
|
63
|
+
|
64
|
+
# Always nil on MS Windows. Provided for interface compatibility only.
|
65
|
+
attr_reader :pass_number
|
66
|
+
|
67
|
+
# Always nil on MS Windows. Provided for interface compatibility only.
|
68
|
+
attr_reader :frequency
|
69
|
+
|
70
|
+
alias fsname name
|
71
|
+
alias dir mount_point
|
72
|
+
alias opts options
|
73
|
+
alias passno pass_number
|
74
|
+
alias freq frequency
|
75
|
+
end
|
76
|
+
|
77
|
+
class Stat
|
78
|
+
# The path of the file system.
|
79
|
+
attr_reader :path
|
80
|
+
|
81
|
+
# The file system block size. MS Windows typically defaults to 4096.
|
82
|
+
attr_reader :block_size
|
83
|
+
|
84
|
+
# Fragment size. Meaningless at the moment.
|
85
|
+
attr_reader :fragment_size
|
86
|
+
|
87
|
+
# The total number of blocks available (used or unused) on the file
|
88
|
+
# system.
|
89
|
+
attr_reader :blocks
|
90
|
+
|
91
|
+
# The total number of unused blocks.
|
92
|
+
attr_reader :blocks_free
|
93
|
+
|
94
|
+
# The total number of unused blocks available to unprivileged
|
95
|
+
# processes. Identical to +blocks+ at the moment.
|
96
|
+
attr_reader :blocks_available
|
97
|
+
|
98
|
+
# Total number of files/inodes that can be created on the file system.
|
99
|
+
# This attribute is always nil on MS Windows.
|
100
|
+
attr_reader :files
|
101
|
+
|
102
|
+
# Total number of free files/inodes that can be created on the file
|
103
|
+
# system. This attribute is always nil on MS Windows.
|
104
|
+
attr_reader :files_free
|
105
|
+
|
106
|
+
# Total number of available files/inodes for unprivileged processes
|
107
|
+
# that can be created on the file system. This attribute is always
|
108
|
+
# nil on MS Windows.
|
109
|
+
attr_reader :files_available
|
110
|
+
|
111
|
+
# The file system volume id.
|
112
|
+
attr_reader :filesystem_id
|
113
|
+
|
114
|
+
# A bit mask of file system flags.
|
115
|
+
attr_reader :flags
|
116
|
+
|
117
|
+
# The maximum length of a file name permitted on the file system.
|
118
|
+
attr_reader :name_max
|
119
|
+
|
120
|
+
# The file system type, e.g. NTFS, FAT, etc.
|
121
|
+
attr_reader :base_type
|
122
|
+
|
123
|
+
alias inodes files
|
124
|
+
alias inodes_free files_free
|
125
|
+
alias inodes_available files_available
|
126
|
+
end
|
127
|
+
|
128
|
+
# Yields a Filesystem::Mount object for each volume on your system in
|
129
|
+
# block form. Returns an array of Filesystem::Mount objects in non-block
|
130
|
+
# form.
|
131
|
+
#
|
132
|
+
# Example:
|
133
|
+
#
|
134
|
+
# Sys::Filesystem.mounts{ |mount|
|
135
|
+
# p mt.name # => \\Device\\HarddiskVolume1
|
136
|
+
# p mt.mount_point # => C:\
|
137
|
+
# p mt.mount_time # => Thu Dec 18 20:12:08 -0700 2008
|
138
|
+
# p mt.mount_type # => NTFS
|
139
|
+
# p mt.options # => casepres,casesens,ro,unicode
|
140
|
+
# p mt.pass_number # => nil
|
141
|
+
# p mt.dump_freq # => nil
|
142
|
+
# }
|
143
|
+
#
|
144
|
+
# This method is a bit of a fudge for MS Windows in the name of interface
|
145
|
+
# compatibility because this method deals with volumes, not actual mount
|
146
|
+
# points. But, I believe it provides the sort of information many users
|
147
|
+
# want at a glance.
|
148
|
+
#
|
149
|
+
# The possible values for the +options+ and their meanings are as follows:
|
150
|
+
#
|
151
|
+
# casepres => The filesystem preserves the case of file names when it places a name on disk.
|
152
|
+
# casesens => The filesystem supports case-sensitive file names.
|
153
|
+
# compression => The filesystem supports file-based compression.
|
154
|
+
# namedstreams => The filesystem supports named streams.
|
155
|
+
# pacls => The filesystem preserves and enforces access control lists.
|
156
|
+
# ro => The filesystem is read-only.
|
157
|
+
# encryption => The filesystem supports the Encrypted File System (EFS).
|
158
|
+
# objids => The filesystem supports object identifiers.
|
159
|
+
# rpoints => The filesystem supports reparse points.
|
160
|
+
# sparse => The filesystem supports sparse files.
|
161
|
+
# unicode => The filesystem supports Unicode in file names as they appear on disk.
|
162
|
+
# compressed => The filesystem is compressed.
|
163
|
+
#
|
164
|
+
def self.mounts
|
165
|
+
buffer = 0.chr * MAXPATH
|
166
|
+
length = GetLogicalDriveStrings(buffer.size, buffer)
|
167
|
+
|
168
|
+
if length == 0
|
169
|
+
raise Error, get_last_error
|
170
|
+
end
|
171
|
+
|
172
|
+
mounts = block_given? ? nil : []
|
173
|
+
|
174
|
+
# Try again if it fails
|
175
|
+
if length > buffer.size
|
176
|
+
buffer = 0.chr * length
|
177
|
+
if GetLogicalDriveStrings(buffer.size, buffer) == 0
|
178
|
+
raise Error, get_last_error
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
boot_time = get_boot_time
|
183
|
+
|
184
|
+
drives = buffer.strip.split("\0")
|
185
|
+
|
186
|
+
drives.each{ |drive|
|
187
|
+
mount = Mount.new
|
188
|
+
volume = 0.chr * MAXPATH
|
189
|
+
fsname = 0.chr * MAXPATH
|
190
|
+
|
191
|
+
mount.instance_variable_set(:@mount_point, drive)
|
192
|
+
mount.instance_variable_set(:@mount_time, boot_time)
|
193
|
+
|
194
|
+
volume_serial_number = [0].pack('L')
|
195
|
+
max_component_length = [0].pack('L')
|
196
|
+
filesystem_flags = [0].pack('L')
|
197
|
+
|
198
|
+
bool = GetVolumeInformation(
|
199
|
+
drive,
|
200
|
+
volume,
|
201
|
+
volume.size,
|
202
|
+
volume_serial_number,
|
203
|
+
max_component_length,
|
204
|
+
filesystem_flags,
|
205
|
+
fsname,
|
206
|
+
fsname.size
|
207
|
+
)
|
208
|
+
|
209
|
+
# Skip unmounted floppies or cd-roms
|
210
|
+
unless bool
|
211
|
+
errnum = GetLastError()
|
212
|
+
if errnum == ERROR_NOT_READY
|
213
|
+
next
|
214
|
+
else
|
215
|
+
raise Error, get_last_error(errnum)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
filesystem_flags = filesystem_flags.unpack('L')[0]
|
220
|
+
|
221
|
+
name = 0.chr * MAXPATH
|
222
|
+
|
223
|
+
if QueryDosDevice(drive[0,2], name, name.size) == 0
|
224
|
+
raise Error, get_last_error
|
225
|
+
end
|
226
|
+
|
227
|
+
mount.instance_variable_set(:@name, name.strip)
|
228
|
+
mount.instance_variable_set(:@mount_type, fsname.strip)
|
229
|
+
mount.instance_variable_set(:@options, get_options(filesystem_flags))
|
230
|
+
|
231
|
+
if block_given?
|
232
|
+
yield mount
|
233
|
+
else
|
234
|
+
mounts << mount
|
235
|
+
end
|
236
|
+
}
|
237
|
+
|
238
|
+
mounts # Nil if the block form was used.
|
239
|
+
end
|
240
|
+
|
241
|
+
# Returns the mount point for the given +file+. For MS Windows this
|
242
|
+
# means the root of the path.
|
243
|
+
#
|
244
|
+
# Example:
|
245
|
+
#
|
246
|
+
# File.mount_point("C:\\Documents and Settings") # => "C:\\'
|
247
|
+
#
|
248
|
+
def self.mount_point(file)
|
249
|
+
file = file.tr(File::SEPARATOR, File::ALT_SEPARATOR)
|
250
|
+
PathStripToRoot(file)
|
251
|
+
file[/^[^\0]*/]
|
252
|
+
end
|
253
|
+
|
254
|
+
# Returns a Filesystem::Stat object that contains information about the
|
255
|
+
# +path+ file system.
|
256
|
+
#
|
257
|
+
# Examples:
|
258
|
+
#
|
259
|
+
# File.stat("C:\\")
|
260
|
+
# File.stat("C:\\Documents and Settings\\some_user")
|
261
|
+
#
|
262
|
+
def self.stat(path)
|
263
|
+
bytes_avail = [0].pack('Q')
|
264
|
+
bytes_free = [0].pack('Q')
|
265
|
+
total_bytes = [0].pack('Q')
|
266
|
+
|
267
|
+
unless GetDiskFreeSpaceEx(path, bytes_avail, total_bytes, bytes_free)
|
268
|
+
raise Error, get_last_error
|
269
|
+
end
|
270
|
+
|
271
|
+
bytes_avail = bytes_avail.unpack('Q').first
|
272
|
+
bytes_free = bytes_free.unpack('Q').first
|
273
|
+
total_bytes = total_bytes.unpack('Q').first
|
274
|
+
|
275
|
+
sectors = [0].pack('Q')
|
276
|
+
bytes = [0].pack('Q')
|
277
|
+
free = [0].pack('Q')
|
278
|
+
total = [0].pack('Q')
|
279
|
+
|
280
|
+
unless GetDiskFreeSpace(path, sectors, bytes, free, total)
|
281
|
+
raise Error, get_last_error
|
282
|
+
end
|
283
|
+
|
284
|
+
sectors = sectors.unpack('Q').first
|
285
|
+
bytes = bytes.unpack('Q').first
|
286
|
+
free = free.unpack('Q').first
|
287
|
+
total = total.unpack('Q').first
|
288
|
+
|
289
|
+
block_size = sectors * bytes
|
290
|
+
blocks_avail = total_bytes / block_size
|
291
|
+
blocks_free = bytes_free / block_size
|
292
|
+
|
293
|
+
vol_name = 0.chr * 260
|
294
|
+
base_type = 0.chr * 260
|
295
|
+
vol_serial = [0].pack('L')
|
296
|
+
name_max = [0].pack('L')
|
297
|
+
flags = [0].pack('L')
|
298
|
+
|
299
|
+
bool = GetVolumeInformation(
|
300
|
+
path,
|
301
|
+
vol_name,
|
302
|
+
vol_name.size,
|
303
|
+
vol_serial,
|
304
|
+
name_max,
|
305
|
+
flags,
|
306
|
+
base_type,
|
307
|
+
base_type.size
|
308
|
+
)
|
309
|
+
|
310
|
+
unless bool
|
311
|
+
raise Error, get_last_error
|
312
|
+
end
|
313
|
+
|
314
|
+
vol_serial = vol_serial.unpack('L').first
|
315
|
+
name_max = name_max.unpack('L').first
|
316
|
+
flags = flags.unpack('L').first
|
317
|
+
base_type = base_type[/^[^\0]*/]
|
318
|
+
|
319
|
+
stat_obj = Stat.new
|
320
|
+
stat_obj.instance_variable_set(:@path, path)
|
321
|
+
stat_obj.instance_variable_set(:@block_size, block_size)
|
322
|
+
stat_obj.instance_variable_set(:@blocks, blocks_avail)
|
323
|
+
stat_obj.instance_variable_set(:@blocks_available, blocks_avail)
|
324
|
+
stat_obj.instance_variable_set(:@blocks_free, blocks_free)
|
325
|
+
stat_obj.instance_variable_set(:@name_max, name_max)
|
326
|
+
stat_obj.instance_variable_set(:@base_type, base_type)
|
327
|
+
stat_obj.instance_variable_set(:@flags, flags)
|
328
|
+
stat_obj.instance_variable_set(:@filesystem_id, vol_serial)
|
329
|
+
|
330
|
+
stat_obj.freeze # Read-only object
|
331
|
+
end
|
332
|
+
|
333
|
+
private
|
334
|
+
|
335
|
+
# This method is used to get the boot time of the system, which is used
|
336
|
+
# for the mount_time attribute within the File.mounts method.
|
337
|
+
#
|
338
|
+
def self.get_boot_time
|
339
|
+
host = Socket.gethostname
|
340
|
+
cs = "winmgmts://#{host}/root/cimv2"
|
341
|
+
begin
|
342
|
+
wmi = WIN32OLE.connect(cs)
|
343
|
+
rescue WIN32OLERuntimeError => e
|
344
|
+
raise Error, e
|
345
|
+
else
|
346
|
+
query = 'select LastBootupTime from Win32_OperatingSystem'
|
347
|
+
results = wmi.ExecQuery(query)
|
348
|
+
results.each{ |ole|
|
349
|
+
time_array = Time.parse(ole.LastBootupTime.split('.').first)
|
350
|
+
return Time.mktime(*time_array)
|
351
|
+
}
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
# Private method that converts filesystem flags into a comma separated
|
356
|
+
# list of strings. The presentation is meant as a rough analogue to the
|
357
|
+
# way options are presented for Unix filesystems.
|
358
|
+
#
|
359
|
+
def self.get_options(flags)
|
360
|
+
str = ""
|
361
|
+
str << " casepres" if CASE_PRESERVED_NAMES & flags > 0
|
362
|
+
str << " casesens" if CASE_SENSITIVE_SEARCH & flags > 0
|
363
|
+
str << " compression" if FILE_COMPRESSION & flags > 0
|
364
|
+
str << " namedstreams" if NAMED_STREAMS & flags > 0
|
365
|
+
str << " pacls" if PERSISTENT_ACLS & flags > 0
|
366
|
+
str << " ro" if READ_ONLY_VOLUME & flags > 0
|
367
|
+
str << " encryption" if SUPPORTS_ENCRYPTION & flags > 0
|
368
|
+
str << " objids" if SUPPORTS_OBJECT_IDS & flags > 0
|
369
|
+
str << " rpoints" if SUPPORTS_REPARSE_POINTS & flags > 0
|
370
|
+
str << " sparse" if SUPPORTS_SPARSE_FILES & flags > 0
|
371
|
+
str << " unicode" if UNICODE_ON_DISK & flags > 0
|
372
|
+
str << " compressed" if VOLUME_IS_COMPRESSED & flags > 0
|
373
|
+
|
374
|
+
str.tr!(' ', ',')
|
375
|
+
str = str[1..-1] # Ignore the first comma
|
376
|
+
str
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
# Some convenient methods for converting bytes to kb, mb, and gb.
|
383
|
+
#
|
384
|
+
class Fixnum
|
385
|
+
# call-seq:
|
386
|
+
# <tt>fix</tt>.to_kb
|
387
|
+
#
|
388
|
+
# Returns +fix+ in terms of kilobytes.
|
389
|
+
def to_kb
|
390
|
+
self / 1024
|
391
|
+
end
|
392
|
+
|
393
|
+
# call-seq:
|
394
|
+
# <tt>fix</tt>.to_mb
|
395
|
+
#
|
396
|
+
# Returns +fix+ in terms of megabytes.
|
397
|
+
def to_mb
|
398
|
+
self / 1048576
|
399
|
+
end
|
400
|
+
|
401
|
+
# call-seq:
|
402
|
+
# <tt>fix</tt>.to_gb
|
403
|
+
#
|
404
|
+
# Returns +fix+ in terms of gigabytes.
|
405
|
+
def to_gb
|
406
|
+
self / 1073741824
|
407
|
+
end
|
408
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
spec = Gem::Specification.new do |gem|
|
4
|
+
gem.name = 'sys-filesystem'
|
5
|
+
gem.version = '0.3.2'
|
6
|
+
gem.author = 'Daniel J. Berger'
|
7
|
+
gem.email = 'djberg96@gmail.com'
|
8
|
+
gem.homepage = 'http://www.rubyforge.org/projects/sysutils'
|
9
|
+
gem.platform = Gem::Platform::RUBY
|
10
|
+
gem.summary = 'A Ruby interface for getting file system information.'
|
11
|
+
gem.test_file = 'test/test_sys_filesystem.rb'
|
12
|
+
gem.has_rdoc = true
|
13
|
+
gem.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
14
|
+
gem.license = 'Artistic 2.0'
|
15
|
+
|
16
|
+
gem.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST']
|
17
|
+
gem.rubyforge_project = 'sysutils'
|
18
|
+
|
19
|
+
gem.add_development_dependency('test-unit', '>= 2.0.3')
|
20
|
+
|
21
|
+
gem.description = <<-EOF
|
22
|
+
The sys-filesystem library provides an interface for gathering filesystem
|
23
|
+
information, such as disk space and mount point data.
|
24
|
+
EOF
|
25
|
+
end
|
@@ -0,0 +1,248 @@
|
|
1
|
+
####################################################################
|
2
|
+
# test_sys_filesystem_unix.rb
|
3
|
+
#
|
4
|
+
# Test case for the Sys::Filesystem.stat method and related stuff.
|
5
|
+
# This test suite should be run via the 'rake test' task.
|
6
|
+
####################################################################
|
7
|
+
require 'rubygems'
|
8
|
+
gem 'test-unit'
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require 'sys/filesystem'
|
12
|
+
include Sys
|
13
|
+
|
14
|
+
class TC_Sys_Filesystem_Unix < Test::Unit::TestCase
|
15
|
+
def self.startup
|
16
|
+
@@solaris = Config::CONFIG['host_os'] =~ /solaris/i
|
17
|
+
@@linux = Config::CONFIG['host_os'] =~ /linux/i
|
18
|
+
@@freebsd = Config::CONFIG['host_os'] =~ /freebsd/i
|
19
|
+
@@darwin = Config::CONFIG['host_os'] =~ /darwin/i
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@dir = "/"
|
24
|
+
@stat = Filesystem.stat(@dir)
|
25
|
+
@mnt = Filesystem.mounts[0]
|
26
|
+
@size = 58720256
|
27
|
+
@array = []
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_version
|
31
|
+
assert_equal('0.3.2', Filesystem::VERSION)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_stat_path
|
35
|
+
assert_respond_to(@stat, :path)
|
36
|
+
assert_equal("/", @stat.path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_stat_block_size
|
40
|
+
assert_respond_to(@stat, :block_size)
|
41
|
+
assert_kind_of(Fixnum, @stat.block_size)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_stat_fragment_size
|
45
|
+
assert_respond_to(@stat, :fragment_size)
|
46
|
+
assert_kind_of(Fixnum, @stat.fragment_size)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_stat_blocks
|
50
|
+
assert_respond_to(@stat, :blocks)
|
51
|
+
assert_kind_of(Fixnum, @stat.blocks)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_stat_blocks_free
|
55
|
+
assert_respond_to(@stat, :blocks_free)
|
56
|
+
assert_kind_of(Fixnum, @stat.blocks_free)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_stat_blocks_available
|
60
|
+
assert_respond_to(@stat, :blocks_available)
|
61
|
+
assert_kind_of(Fixnum, @stat.blocks_available)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_stat_files
|
65
|
+
assert_respond_to(@stat, :files)
|
66
|
+
assert_kind_of(Fixnum, @stat.files)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_inodes_alias
|
70
|
+
assert_respond_to(@stat, :inodes)
|
71
|
+
assert_true(@stat.method(:inodes) == @stat.method(:files))
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_stat_files_free
|
75
|
+
assert_respond_to(@stat, :files_free)
|
76
|
+
assert_kind_of(Fixnum, @stat.files_free)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_stat_inodes_free_alias
|
80
|
+
assert_respond_to(@stat, :inodes_free)
|
81
|
+
assert_true(@stat.method(:inodes_free) == @stat.method(:files_free))
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_stat_files_available
|
85
|
+
assert_respond_to(@stat, :files_available)
|
86
|
+
assert_kind_of(Fixnum, @stat.files_available)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_stat_inodes_available_alias
|
90
|
+
assert_respond_to(@stat, :inodes_available)
|
91
|
+
assert_true(@stat.method(:inodes_available) == @stat.method(:files_available))
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_stat_filesystem_id
|
95
|
+
assert_respond_to(@stat, :filesystem_id)
|
96
|
+
assert_kind_of(Integer, @stat.filesystem_id)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_stat_flags
|
100
|
+
assert_respond_to(@stat, :flags)
|
101
|
+
assert_kind_of(Fixnum, @stat.flags)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_stat_name_max
|
105
|
+
assert_respond_to(@stat, :name_max)
|
106
|
+
assert_kind_of(Fixnum, @stat.name_max)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_stat_base_type
|
110
|
+
omit_unless(@@solaris, "base_type test skipped except on Solaris")
|
111
|
+
|
112
|
+
assert_respond_to(@stat, :base_type)
|
113
|
+
assert_kind_of(String, @stat.base_type)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_stat_constants
|
117
|
+
assert_not_nil(Filesystem::Stat::RDONLY)
|
118
|
+
assert_not_nil(Filesystem::Stat::NOSUID)
|
119
|
+
|
120
|
+
omit_unless(@@solaris, "NOTRUNC test skipped except on Solaris")
|
121
|
+
|
122
|
+
assert_not_nil(Filesystem::Stat::NOTRUNC)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_stat_expected_errors
|
126
|
+
assert_raises(ArgumentError){ Filesystem.stat }
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_fixnum_methods_basic
|
130
|
+
assert_respond_to(@size, :to_kb)
|
131
|
+
assert_respond_to(@size, :to_mb)
|
132
|
+
assert_respond_to(@size, :to_gb)
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_to_kb
|
136
|
+
assert_equal(57344, @size.to_kb)
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_to_mb
|
140
|
+
assert_equal(56, @size.to_mb)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_to_gb
|
144
|
+
assert_equal(0, @size.to_gb)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Filesystem::Mount tests
|
148
|
+
|
149
|
+
def test_mounts_with_no_block
|
150
|
+
assert_nothing_raised{ @array = Filesystem.mounts }
|
151
|
+
assert_kind_of(Filesystem::Mount, @array[0])
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_mounts_with_block
|
155
|
+
assert_nothing_raised{ Filesystem.mounts{ |m| @array << m } }
|
156
|
+
assert_kind_of(Filesystem::Mount, @array[0])
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_mounts_high_iteration
|
160
|
+
assert_nothing_raised{ 1000.times{ @array = Filesystem.mounts } }
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_mount_name
|
164
|
+
assert_respond_to(@mnt, :name)
|
165
|
+
assert_kind_of(String, @mnt.name)
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_fsname_alias
|
169
|
+
assert_respond_to(@mnt, :fsname)
|
170
|
+
assert_true(@mnt.method(:fsname) == @mnt.method(:name))
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_mount_point
|
174
|
+
assert_respond_to(@mnt, :mount_point)
|
175
|
+
assert_kind_of(String, @mnt.mount_point)
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_dir_alias
|
179
|
+
assert_respond_to(@mnt, :dir)
|
180
|
+
assert_true(@mnt.method(:dir) == @mnt.method(:mount_point))
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_mount_type
|
184
|
+
assert_respond_to(@mnt, :mount_type)
|
185
|
+
assert_kind_of(String, @mnt.mount_type)
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_mount_options
|
189
|
+
assert_respond_to(@mnt, :options)
|
190
|
+
assert_kind_of(String, @mnt.options)
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_opts_alias
|
194
|
+
assert_respond_to(@mnt, :opts)
|
195
|
+
assert_true(@mnt.method(:opts) == @mnt.method(:options))
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_mount_time
|
199
|
+
assert_respond_to(@mnt, :mount_time)
|
200
|
+
|
201
|
+
if @@solaris
|
202
|
+
assert_kind_of(Time, @mnt.mount_time)
|
203
|
+
else
|
204
|
+
assert_nil(@mnt.mount_time)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_mount_dump_frequency
|
209
|
+
omit_if(@@solaris || @@freebsd || @@darwin, 'dump_frequency test skipped on this platform')
|
210
|
+
assert_respond_to(@mnt, :dump_frequency)
|
211
|
+
assert_kind_of(Fixnum, @mnt.dump_frequency)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_freq_alias
|
215
|
+
assert_respond_to(@mnt, :freq)
|
216
|
+
assert_true(@mnt.method(:freq) == @mnt.method(:dump_frequency))
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_mount_pass_number
|
220
|
+
omit_if(@@solaris || @@freebsd || @@darwin, 'pass_number test skipped on this platform')
|
221
|
+
assert_respond_to(@mnt, :pass_number)
|
222
|
+
assert_kind_of(Fixnum, @mnt.pass_number)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_passno_alias
|
226
|
+
assert_respond_to(@mnt, :passno)
|
227
|
+
assert_true(@mnt.method(:passno) == @mnt.method(:pass_number))
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_mount_point_singleton
|
231
|
+
assert_respond_to(Filesystem, :mount_point)
|
232
|
+
assert_nothing_raised{ Filesystem.mount_point(Dir.pwd) }
|
233
|
+
assert_kind_of(String, Filesystem.mount_point(Dir.pwd))
|
234
|
+
end
|
235
|
+
|
236
|
+
def teardown
|
237
|
+
@dir = nil
|
238
|
+
@stat = nil
|
239
|
+
@array = nil
|
240
|
+
end
|
241
|
+
|
242
|
+
def self.shutdown
|
243
|
+
@@solaris = nil
|
244
|
+
@@linux = nil
|
245
|
+
@@freebsd = nil
|
246
|
+
@@darwin = nil
|
247
|
+
end
|
248
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
####################################################################
|
2
|
+
# test_sys_filesystem_windows.rb
|
3
|
+
#
|
4
|
+
# Test case for the Sys::Filesystem.stat method and related stuff.
|
5
|
+
# This should be run via the 'rake test' task.
|
6
|
+
####################################################################
|
7
|
+
require 'rubygems'
|
8
|
+
gem 'test-unit'
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require 'sys/filesystem'
|
12
|
+
require 'rbconfig'
|
13
|
+
include Sys
|
14
|
+
|
15
|
+
class TC_Sys_Filesystem_Windows < Test::Unit::TestCase
|
16
|
+
def setup
|
17
|
+
@dir = '/'
|
18
|
+
@stat = Filesystem.stat(@dir)
|
19
|
+
@mount = Filesystem.mounts[0]
|
20
|
+
@size = 58720256
|
21
|
+
@array = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_version
|
25
|
+
assert_equal('0.3.2', Filesystem::VERSION)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_stat_path
|
29
|
+
assert_respond_to(@stat, :path)
|
30
|
+
assert_equal("/", @stat.path)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_stat_block_size
|
34
|
+
assert_respond_to(@stat, :block_size)
|
35
|
+
assert_kind_of(Fixnum, @stat.block_size)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_stat_fragment_size
|
39
|
+
assert_respond_to(@stat, :fragment_size)
|
40
|
+
assert_nil(@stat.fragment_size)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_stat_blocks
|
44
|
+
assert_respond_to(@stat, :blocks)
|
45
|
+
assert_kind_of(Fixnum, @stat.blocks)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_stat_blocks_free
|
49
|
+
assert_respond_to(@stat, :blocks_free)
|
50
|
+
assert_kind_of(Fixnum, @stat.blocks_free)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_stat_blocks_available
|
54
|
+
assert_respond_to(@stat, :blocks_available)
|
55
|
+
assert_kind_of(Fixnum, @stat.blocks_available)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_stat_files
|
59
|
+
assert_respond_to(@stat, :files)
|
60
|
+
assert_respond_to(@stat, :inodes) # Alias
|
61
|
+
assert_nil(@stat.files)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_stat_files_free
|
65
|
+
assert_respond_to(@stat, :files_free)
|
66
|
+
assert_respond_to(@stat, :inodes_free) # Alias
|
67
|
+
assert_nil(@stat.files_free)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_stat_files_available
|
71
|
+
assert_respond_to(@stat, :files_available)
|
72
|
+
assert_respond_to(@stat, :inodes_available) # Alias
|
73
|
+
assert_nil(@stat.files_available)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_stat_filesystem_id
|
77
|
+
assert_respond_to(@stat, :filesystem_id)
|
78
|
+
assert_kind_of(Integer, @stat.filesystem_id)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_stat_flags
|
82
|
+
assert_respond_to(@stat, :flags)
|
83
|
+
assert_kind_of(Fixnum, @stat.flags)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_stat_name_max
|
87
|
+
assert_respond_to(@stat, :name_max)
|
88
|
+
assert_kind_of(Fixnum, @stat.name_max)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_stat_base_type
|
92
|
+
assert_respond_to(@stat, :base_type)
|
93
|
+
assert_kind_of(String, @stat.base_type)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_mount_point_singleton
|
97
|
+
assert_respond_to(Filesystem, :mount_point)
|
98
|
+
assert_nothing_raised{ Filesystem.mount_point(Dir.pwd) }
|
99
|
+
assert_kind_of(String, Filesystem.mount_point(Dir.pwd))
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_constants
|
103
|
+
assert_not_nil(Filesystem::CASE_SENSITIVE_SEARCH)
|
104
|
+
assert_not_nil(Filesystem::CASE_PRESERVED_NAMES)
|
105
|
+
assert_not_nil(Filesystem::UNICODE_ON_DISK)
|
106
|
+
assert_not_nil(Filesystem::PERSISTENT_ACLS)
|
107
|
+
assert_not_nil(Filesystem::FILE_COMPRESSION)
|
108
|
+
assert_not_nil(Filesystem::VOLUME_QUOTAS)
|
109
|
+
assert_not_nil(Filesystem::SUPPORTS_SPARSE_FILES)
|
110
|
+
assert_not_nil(Filesystem::SUPPORTS_REPARSE_POINTS)
|
111
|
+
assert_not_nil(Filesystem::SUPPORTS_REMOTE_STORAGE)
|
112
|
+
assert_not_nil(Filesystem::VOLUME_IS_COMPRESSED)
|
113
|
+
assert_not_nil(Filesystem::SUPPORTS_OBJECT_IDS)
|
114
|
+
assert_not_nil(Filesystem::SUPPORTS_ENCRYPTION)
|
115
|
+
assert_not_nil(Filesystem::NAMED_STREAMS)
|
116
|
+
assert_not_nil(Filesystem::READ_ONLY_VOLUME)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_stat_expected_errors
|
120
|
+
assert_raises(ArgumentError){ Filesystem.stat }
|
121
|
+
end
|
122
|
+
|
123
|
+
# Filesystem.mounts
|
124
|
+
|
125
|
+
def test_mounts_constructor_basic
|
126
|
+
assert_respond_to(Filesystem, :mounts)
|
127
|
+
assert_nothing_raised{ Filesystem.mounts }
|
128
|
+
assert_nothing_raised{ Filesystem.mounts{} }
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_mounts
|
132
|
+
assert_kind_of(Array, Filesystem.mounts)
|
133
|
+
assert_kind_of(Filesystem::Mount, Filesystem.mounts[0])
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_mounts_block_form
|
137
|
+
assert_nil(Filesystem.mounts{})
|
138
|
+
assert_nothing_raised{ Filesystem.mounts{ |mt| @array << mt }}
|
139
|
+
assert_kind_of(Filesystem::Mount, @array[0])
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_mount_name
|
143
|
+
assert_respond_to(@mount, :name)
|
144
|
+
assert_kind_of(String, @mount.name)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_mount_time
|
148
|
+
assert_respond_to(@mount, :mount_time)
|
149
|
+
assert_kind_of(Time, @mount.mount_time)
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_mount_type
|
153
|
+
assert_respond_to(@mount, :mount_type)
|
154
|
+
assert_kind_of(String, @mount.mount_type)
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_mount_point
|
158
|
+
assert_respond_to(@mount, :mount_point)
|
159
|
+
assert_kind_of(String, @mount.mount_point)
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_mount_options
|
163
|
+
assert_respond_to(@mount, :options)
|
164
|
+
assert_kind_of(String, @mount.options)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_pass_number
|
168
|
+
assert_respond_to(@mount, :pass_number)
|
169
|
+
assert_nil(@mount.pass_number)
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_frequency
|
173
|
+
assert_respond_to(@mount, :frequency)
|
174
|
+
assert_nil(@mount.frequency)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_mounts_expected_errors
|
178
|
+
assert_raise(ArgumentError){ Filesystem.mounts("C:\\") }
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_fixnum_methods
|
182
|
+
assert_respond_to(@size, :to_kb)
|
183
|
+
assert_respond_to(@size, :to_mb)
|
184
|
+
assert_respond_to(@size, :to_gb)
|
185
|
+
|
186
|
+
assert_equal(57344, @size.to_kb)
|
187
|
+
assert_equal(56, @size.to_mb)
|
188
|
+
assert_equal(0, @size.to_gb)
|
189
|
+
end
|
190
|
+
|
191
|
+
def teardown
|
192
|
+
@array = nil
|
193
|
+
@dir = nil
|
194
|
+
@stat = nil
|
195
|
+
@size = nil
|
196
|
+
@mount = nil
|
197
|
+
end
|
198
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sys-filesystem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.2
|
5
|
+
platform: x86-mingw32
|
6
|
+
authors:
|
7
|
+
- Daniel J. Berger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-30 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: test-unit
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.0.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: windows-pr
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.5
|
34
|
+
version:
|
35
|
+
description: " The sys-filesystem library provides an interface for gathering filesystem\n information, such as disk space and mount point data.\n"
|
36
|
+
email: djberg96@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- CHANGES
|
43
|
+
- README
|
44
|
+
- MANIFEST
|
45
|
+
files:
|
46
|
+
- CHANGES
|
47
|
+
- examples/example_stat.rb
|
48
|
+
- lib/sys/filesystem.rb
|
49
|
+
- MANIFEST
|
50
|
+
- Rakefile
|
51
|
+
- README
|
52
|
+
- sys-filesystem.gemspec
|
53
|
+
- test/test_sys_filesystem.rb
|
54
|
+
- test/test_sys_filesystem_unix.rb
|
55
|
+
- test/test_sys_filesystem_windows.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://www.rubyforge.org/projects/sysutils
|
58
|
+
licenses:
|
59
|
+
- Artistic 2.0
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.8.2
|
70
|
+
version:
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
version:
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project: sysutils
|
80
|
+
rubygems_version: 1.3.5
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: A Ruby interface for getting file system information.
|
84
|
+
test_files:
|
85
|
+
- test/test_sys_filesystem.rb
|