Skip to content

Commit

Permalink
Add FileGetSize
Browse files Browse the repository at this point in the history
  • Loading branch information
phil294 committed Jul 20, 2023
1 parent 161764b commit f802465
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 15 deletions.
8 changes: 4 additions & 4 deletions README.md
Expand Up @@ -55,7 +55,7 @@ AHK_X11 can be used completely without a terminal. You can however if you want u
<details><summary><strong>CLICK TO SEE WHICH COMMANDS ARE IMPLEMENTED AND WHICH ARE MISSING</strong>. Note however that this is not very representative. For example, no `Gui` sub command is included in the listing. For a better overview on what is already done, skim through the <a href="https://phil294.github.io/AHK_X11"><b>FULL DOCUMENTATION HERE</b></a>.</summary>

```diff
DONE ?% (120/220):
DONE ?% (121/220):
+ Else, { ... }, Break, Continue, Return, Exit, GoSub, GoTo, IfEqual, Loop, SetEnv, Sleep, FileCopy,
+ SetTimer, WinActivate, MsgBox, Gui, SendRaw, #Persistent, ExitApp,
+ EnvAdd, EnvSub, EnvMult, EnvDiv, ControlSendRaw, IfWinExist/IfWinNotExist, SetWorkingDir,
Expand All @@ -72,7 +72,7 @@ DONE ?% (120/220):
+ PixelSearch, #Include, InputBox, ClipWait, EnvSet, SetKeyDelay, SetMouseDelay, MouseClickDrag,
+ #NoTrayIcon, TrayTip, Random, Shutdown, RunAs, SoundGet, SoundSet, SoundPlay, Sort,
+ StringTrimLeft, StringTrimRight, WinMinimizeAll, WinMinimizeAllUndo, WinSetTitle, WinWait,
+ WinWaitClose, WinWaitActive, WinWaitNotActive, DriveSpaceFree
+ WinWaitClose, WinWaitActive, WinWaitNotActive, DriveSpaceFree, FileGetSize

NEW ?% (9/220): (not part of spec or from a more recent version)
@@ Echo, ahk_x11_print_vars, FileRead, RegExGetPos, RegExReplace, EnvGet, Click @@
Expand All @@ -87,12 +87,12 @@ REMOVED ?% (11/220):
# AutoTrim: It's always Off. It would not differentiate between %a_space% and %some_var%.
# It's possible but needs significant work.

TO DO ?% (76/220): alphabetically
TO DO ?% (75/220): alphabetically
- BlockInput, Control, ControlFocus, ControlGet, ControlGetFocus,
- ControlMove,
- DetectHiddenText, DetectHiddenWindows, Drive, DriveGet,
- FileCopyDir, FileCreateShortcut,
- FileInstall, FileGetAttrib, FileGetShortcut, FileGetSize, FileGetTime, FileGetVersion,
- FileInstall, FileGetAttrib, FileGetShortcut, FileGetTime, FileGetVersion,
- FileMove, FileMoveDir, FileRecycle, FileRecycleEmpty, FileRemoveDir,
- FormatTime, GroupActivate, GroupAdd,
- GroupClose, GroupDeactivate, GuiControlGet,
Expand Down
8 changes: 4 additions & 4 deletions docs/index.html
Expand Up @@ -117,7 +117,7 @@ <h2>Table of contents </h2>
<a class="tbd" href="#FileGetShortcut.htm">FileGetShortcut</a>
</li>
<li>
<a class="tbd" href="#FileGetSize.htm">FileGetSize</a>
<a href="#FileGetSize.htm">FileGetSize</a>
</li>
<li>
<a href="#FileGetTime.htm">FileGetTime</a>
Expand Down Expand Up @@ -2203,7 +2203,7 @@ <h2 class="calibre9"><span class="calibre23">The "Last Found" Window </span></h2
<td height="16" class="calibre4">Retrieves information about a shortcut (.lnk) file, such as its target file. </td>
</tr>
<tr class="calibre3">
<td height="16" class="tbd calibre4"><a href="#FileGetSize.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileGetSize</a></td>
<td height="16" class="calibre4"><a href="#FileGetSize.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileGetSize</a></td>
<td height="16" class="calibre4">Retrieves the size of a file in bytes, KB, or MB. </td>
</tr>
<tr class="calibre3">
Expand Down Expand Up @@ -3622,7 +3622,7 @@ <h2 class="calibre9"><span class="calibre23">The "Last Found" Window </span></h2
MsgBox %OutTarget%`n%OutDir%`n%OutArgs%`n%OutDesc%`n%OutIcon%`n%OutIconNum%`n%OutRunState%</pre>
</div>
</div>
<div class="calibreMain tbd">
<div class="calibreMain">
<div class="calibreEbookContent">
<a id="FileGetSize.htm" href="#FileGetSize.htm">#</a> <h2 class="calibre17">FileGetSize</h2>
<hr size="2" class="calibre24" />
Expand Down Expand Up @@ -3666,7 +3666,7 @@ <h2 class="calibre9"><span class="calibre23">The "Last Found" Window </span></h2
<p class="calibre8"><a href="#FileGetAttrib.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileGetAttrib</a>, <a href="#FileSetAttrib.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileSetAttrib</a>, <a href="#FileGetTime.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileGetTime</a>, <a href="#FileSetTime.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileSetTime</a>, <a href="#FileGetVersion.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">FileGetVersion</a>, <a href="#LoopFile.htm" class="pcalibre3 pcalibre1 pcalibre calibre5 pcalibre2">File-loop</a></p>
<p class="calibre8"> </p>
<p class="calibre8"><strong class="calibre14">Example</strong></p>
<p class="calibre8"> FileGetSize, size, C:\My Documents\test.doc ; Retrieve the size in bytes.<br class="calibre12" /> FileGetSize, size, C:\My Documents\test.doc, K ; Retrieve the size in Kbytes.<br class="calibre12" />
<p class="calibre8"> FileGetSize, size, %A_Home%/test.doc ; Retrieve the size in bytes.<br class="calibre12" /> FileGetSize, size, /tmp/test.doc, K ; Retrieve the size in Kbytes.<br class="calibre12" />
</p>
</div>
</div>
Expand Down
18 changes: 11 additions & 7 deletions src/cmd/control-flow/loop.cr
Expand Up @@ -68,19 +68,18 @@ class Cmd::ControlFlow::Loop < Cmd::Base
when LoopType::Count
fin = @index > @count.not_nil!
when LoopType::Files
fin = @index > @files.size
if ! fin
match = @files[@index - 1]
file = ::File.new(match)
path = Path.new(match)
file = current_file
fin = ! current_file
if file
path = Path.new(file.path)
stat = uninitialized LibC::Stat
Crystal::System::File.stat(match.check_no_null_byte, pointerof(stat))
Crystal::System::File.stat(file.path.check_no_null_byte, pointerof(stat))
access_time = ::Time.new(stat.st_atim, ::Time::Location::UTC)
# st_ctim is not creation time. Creation time is not available on Crystal, see
# https://github.com/crystal-lang/crystal/issues/12416
# creation_time = ::Time.new(stat.st_ctim, ::Time::Location::UTC)
thread.runner.set_global_built_in_static_var("A_LoopFileName", path.basename)
thread.runner.set_global_built_in_static_var("A_LoopFileFullPath", match)
thread.runner.set_global_built_in_static_var("A_LoopFileFullPath", file.path)
thread.runner.set_global_built_in_static_var("A_LoopFileShortName", path.basename)
thread.runner.set_global_built_in_static_var("A_LoopFileDir", path.dirname)
thread.runner.set_global_built_in_static_var("A_LoopFileTimeModified", file.info.modification_time.to_YYYYMMDDHH24MISS)
Expand Down Expand Up @@ -124,4 +123,9 @@ class Cmd::ControlFlow::Loop < Cmd::Base
@parse_iter = nil
thread.loop_stack.pop
end
def current_file
match = @files[@index - 1]?
return nil if ! match
::File.new(match)
end
end
22 changes: 22 additions & 0 deletions src/cmd/file/file-get-size.cr
@@ -0,0 +1,22 @@
# FileGetSize, OutputVar [, Filename, Units]
class Cmd::File::FileGetSize < Cmd::Base
def self.min_args; 1 end
def self.max_args; 3 end
def self.sets_error_level; true end
def run(thread, args)
out_var = args[0]
filename = args[1]?
if ! filename || filename.empty?
file = (thread.loop_stack.reverse.find &.current_file).try &.current_file
return "1" if ! file
else
return "1" if ! ::File.exists?(filename)
file = ::File.new(filename)
end
size = case args[2]?.try &.downcase
when "k" then file.info.size / 1024
when "m" then file.info.size / 1024 / 1024
else file.info.size end
thread.runner.set_user_var(out_var, size.to_i.to_s)
end
end

0 comments on commit f802465

Please sign in to comment.