Check Ascending Counter

Title CheckAscCounter
File Name CheckAscCounter.txt
Description Check whether files are numbered in ascending order
Author Vochomurka
Parameters ("%P", "%O", "%E")
Plugins Called win, file, miscplugin, clip
Icon
Version 1.4
Updated on 18.04.2019
args Path, Name, Ext

if(!Ext)
	Ext = "*"

Ext = "." ++ Ext
local hwnd = win.handle("c=TTOTAL_CMD")
local Exepath = win.exepath(hwnd)
local Len = length(Name)
local mpDlgCaption = "CheckAscCounter Script"
local mpIcon = "e:\Storage\Graphics\Icons\User\Incr.ico"
local i, j, Char, mpDlgText, Prev, Cur
local Quote = esc(?+\"+, ?+\+)
local CtC = "&Copy to Clip"
local Gt = "&Go to"

for(i = Len; i > 0; i--)
	Char = Name[i - 1]
	if(not miscplugin.is_int(Char))
		break

endfor

switch (i)
	case Len
		Char = "File name " ++ Name ++ Ext ++ " contains no counter"
		messagebox("ok error", Char, mpDlgCaption)
		quit
	case 0
		Char = Name
		Name = ""
		break
	case else
		Char = Name[i, Len - 1]
		Name = Name[0, i - 1]
endswitch

local Digits = length(Char)
local Total = repeat("9", Digits)

for(i = eval(Char); i <= Total; i++)
	Len = fill(repeat("0", Digits), i)
	Cur = Path ++ Name ++ Len ++ Ext
	miscplugin.BalloonTip(1, "information", i, "timeout=5")

	if(!validpath(Cur)) do
		mpDlgText = "First missing file is '" ++ Cur ++ "'"
		local Ans = miscplugin.messagebox(1, Gt, CtC, "&Exit")
		if(Ans == Gt) do
			if(!Prev) do
				win.sendmessage(hwnd, 0x400+51, 2050, 0)
			else
				do(Exepath,"/O /S /L=" ++ Quote ++ Path ++ Prev ++ Ext ++ Quote)
				*keys {down}
			endif
		elseif(Ans == CtC) do
			clip.set(Cur)
		endif
		quit
	endif
	Prev = Name ++ Len
endfor

Comments:

How is it convenient to name files, especially if their order matters? Of course, with a counter, for example:

file-001
file-002
...
or
0001
0002
...

Therefore, all file names are ending with a certain quantity of numeric characters.

But at deleting, adding, or renaming files their numbering is disturbed. The script checks whether files are numbered sequentially, in ascending order, starting with 1. When the disturbance is found, the script allows either to go directly to the next file, or to copy the missing name to the clipboard. Before running the script the cursor should be placed on any file to be a "sample" to check others.

Why not use MultiRename Tool right away? Because the MultiRename Tool operation can take a great time for which Total Commander remains unavailable. For example, in one directory on my computer there are 24589 sequentially numbered files. If missing file has number, say, 24585, then there is no sense to rename all files.


Check Descending Counter

Title CheckDescCounter
File Name CheckDescCounter.txt
Description Check whether files are numbered in descending order
Author Vochomurka
Parameters ("%P", "%O", "%E")
Plugins Called win, file, miscplugin, clip
Icon
Version 1.4
Updated on 18.04.2019
args Path, Name, Ext

if(!Ext)
	Ext = "*"

Ext = "." ++ Ext
local hwnd = win.handle("c=TTOTAL_CMD")
local Exepath = win.exepath(hwnd)
local Len = length(Name)
local mpDlgCaption = "CheckAscCounter Script"
local mpIcon = "e:\Storage\Graphics\Icons\User\Incr.ico"
local i, j, Char, mpDlgText, Prev, Cur
local Quote = esc(?+\"+, ?+\+)
local CtC = "&Copy to Clip"
local Gt = "&Go to"

for(i = Len; i > 0; i--)
	Char = Name[i - 1]
	if(not miscplugin.is_int(Char))
		break

endfor

switch (i)
	case Len
		Char = "File name " ++ Name ++ Ext ++ " contains no counter"
		messagebox("ok error", Char, mpDlgCaption)
		quit
	case 0
		Char = Name
		Name = ""
		break
	case else
		Char = Name[i, Len - 1]
		Name = Name[0, i - 1]
endswitch

local Digits = length(Char)
local Total = repeat("0", Digits)

for(i = eval(Char); i >= Total; i--)
	Len = fill(repeat("0", Digits), i)
	Cur = Path ++ Name ++ Len ++ Ext
	miscplugin.BalloonTip(1, "information", i, "timeout=5")

	if(!validpath(Cur)) do
		mpDlgText = "First missing file is '" ++ Cur ++ "'"
		local Ans = miscplugin.messagebox(1, Gt, CtC, "&Exit")
		if(Ans == Gt) do
			if(!Prev) do
				win.sendmessage(hwnd, 0x400+51, 2050, 0)
			else
				do(Exepath,"/O /S /L=" ++ Quote ++ Path ++ Prev ++ Ext ++ Quote)
				*keys {down}
			endif
		elseif(Ans == CtC) do
			clip.set(Cur)
		endif
		quit
	endif
	Prev = Name ++ Len
endfor

Comments:

The difference between previous script and this one is that the latter checks numbers in descending order:

...
file98
file99
or
...
9998
9999

Number consisting of nines is checked first.


Main Page Total Commander PowerPro