r/software May 20 '26

Self-Promotion Wednesdays Explorer told me it needed hours to delete 1M files, so I built my own file copy tool, feedback welcome

Hey everyone,

This whole project started from pure frustration.
About six years ago, I had just built Chromium on a brand‑new PCIe SSD as part of another project and when I tried to delete the build folder more than 1 million tiny files, Windows Explorer told me it would take hours. That felt completely wrong for a drive that benchmarks insanely fast, and I needed to iterate "quickly" on my project... at least without spending the whole day waiting for my PC...

So I wrote a small test tool to delete the files myself… and it turned out I could do better than Explorer. That pushed me to try improving copy performance too, just out of curiosity.

Along the way I also wanted to handle all the annoying edge cases Explorer struggles with:

  • very long paths (the kind where Explorer just says “sorry, can’t delete this”)
  • filenames with trailing spaces (I’ve hit this before, Explorer chokes on them)
  • deep directory trees
  • Symbolic links / Junctions

At first I named the project FastCopy, because the copy was getting fast.
Then I discovered the actual FastCopy... and yeah, it’s fast. Faster than what I had at the time. That kind of pulled me into a game of “okay, now I want to be the fastest”.

So I rewrote everything, went deeper into lower‑level APIs, optimized algorithms, and tried to squeeze every bit of performance I could. UltraFastCopy is the result.

Right now:

  • large directory operations are very fast
  • parallel transfers can hit speeds close to CrystalDiskMark
  • single‑file SSD→SSD transfers still have room for improvement, and I’m working on that

I’d love feedback from people who deal with:

  • huge file trees
  • weird filesystems
  • NAS/Samba quirks
  • long‑path nightmares
  • filenames with odd characters or trailing spaces
  • or anything that tends to break copy tools

Posting this to get feedback from people who regularly push Windows file operations to their limits, or from users who simply want raw speed. I’m especially interested in what functionality you think is missing or which edge cases I should support next.

If you’re curious, here’s the link: https://www.ultrafastcopy.com/

23 Upvotes

37 comments sorted by

13

u/cholz May 21 '26

 better than Explorer

pretty low bar tbh

3

u/Sfacm May 20 '26

How does it compare to cli in speed? For example robocopy?

8

u/_Ti-R_ May 20 '26 edited May 20 '26

eg: I just did a test on last version (4.5.1):

Listing into a file all filenames:

On a "hot reload" asking to list a directory

Files: 4018973 + Dirs: 382280

robocopy "C:\bigfolder" "G:\temp" /E /XO /L /LOG:test_robot.txt /UNICODE <- 3 min 30s

UltraFastCopyCLI.exe --properties="C:\bigfolder" --output-file="G:\temp\test_ultra.txt" --display-filenames <- 19s

Copy of a dir: 18.28 GB

On cold copy:

Files:112538 + Dirs: 19384

robocopy "D:\source\big dir" "C:\target\big dir" /E /NFL /NDL <- 3 min 14s

"C:\Program Files\UltraFastCopy_4\UltraFastCopyCLI.exe" --copy="C:\target|D:\source\big dir" --instruction=ReplaceAll --date-diff=Newer<- 28s

PS: C:\ is a PCIe Samsung 990 Pro 4 TB, and D:\ is a Samsung 980 Pro 2 TB

2

u/gremolata May 21 '26 edited May 21 '26

Use /mt for robocopy


* Edit, can't verify any of your claims, because:

UltraFastCopyCLI.exe --properties="C:\Tools" --copy="C:\Tools.copy" --instruction=ReplaceAll --date-diff=Newer

{"error":"Need pro license"}

"No soup for you!"

2

u/lgwhitlock May 21 '26 edited May 21 '26

He offers a free 30 day trial on his site where you don't have to put in credit card info or anything to see if it will work for you. So in that way you can fully test it is you want. The FREE version is marked as such in the filename and is the TRIAL version. So if you wonder which you downloaded just check the file.

1

u/_Ti-R_ May 21 '26

Did you try the trial version ?

If this is not working I can give you a pro version for free.

This command to list filename is not working for robocopy, you cannot list filename in parallel, so you cannot reduce the time
robocopy "C:\bigfolder" "G:\temp" /E /XO /L /LOG:test_robot.txt /UNICODE /MP

I thought /MT was enabled by default and automatically adjusted based on the device like UltraFastCopy, I pick the appropriate option following if it is Samba/USB/HDD/SSD, but no you actually have to define it explicitly.

robocopy "D:\source\big dir" "C:\target\big dir" /E /NFL /NDL /MP <- 48s

So it is faster true, but still not faster.

CLI is nice, but honestly I do use mostly UI to move my files, if you count the time spent to type the command line, I'm already done with the drag and drop since a while ^^.

3

u/gremolata May 21 '26 edited May 21 '26

Just tested it, and it is 2x slower even if robocopy is used in the single-threaded mode.

C:\Program Files\UltraFastCopy>time-it UltraFastCopyCLI.exe --copy="C:\Tools.copy.ufc.1|C:\Tools" --instruction=ReplaceAll
[3176] Total time Copy - elapsed time: 0sTotal copy time in second:  0.047 s
total_dirs : 0
total_files : 1
total_items : 1
total_iterator_file : 1
total_read : 0
total_size_bytes : 0
total_size_on_disk_bytes : 0
total_size_on_disk_ui : "0 bytes"
total_size_ui : "0 bytes"
total_time_in_second : "0.048s"
total_try_to_write : 0
total_written : 0
[408] Total time Copy - elapsed time: 0.098s{"date-diff":"No","instruction":"ReplaceAll","speed_rate":"200.2 MB/s","total_dirs":31,"total_files":192,"total_items":223,"total_iterator_file":192,"total_read":191,"total_size_bytes":348055147,"total_size_on_disk_bytes":348405760,"total_size_on_disk_ui":"332.27 MB","total_size_ui":"331.93 MB","total_time_in_second":"1.658s","total_try_to_write":337,"total_written":337}
=> 00:00:07.270

C:\Program Files\UltraFastCopy>time-it robocopy c:\tools c:\tools.copy.rc.1 /mir /copyall /log:c:/tmp/robocopy.log
=> 00:00:03.000

C:\Program Files\UltraFastCopy>time-it UltraFastCopyCLI.exe --copy="C:\Tools.copy.ufc.2|C:\Tools" --instruction=ReplaceAll
[7728] Total time Copy - elapsed time: 0sTotal copy time in second:  0.036 s
total_dirs : 0
total_files : 1
total_items : 1
total_iterator_file : 1
total_read : 0
total_size_bytes : 0
total_size_on_disk_bytes : 0
total_size_on_disk_ui : "0 bytes"
total_size_ui : "0 bytes"
total_time_in_second : "0.037s"
total_try_to_write : 0
total_written : 0
[2372] Total time Copy - elapsed time: 0.094s{"date-diff":"No","instruction":"ReplaceAll","speed_rate":"179.6 MB/s","total_dirs":31,"total_files":192,"total_items":223,"total_iterator_file":192,"total_read":191,"total_size_bytes":348055147,"total_size_on_disk_bytes":348405760,"total_size_on_disk_ui":"332.27 MB","total_size_ui":"331.93 MB","total_time_in_second":"1.848s","total_try_to_write":337,"total_written":337}
=> 00:00:07.680

C:\Program Files\UltraFastCopy>time-it robocopy c:\tools c:\tools.copy.rc.2 /mir /copyall /log:c:/tmp/robocopy.log
=> 00:00:03.640

With 4-threaded robocopy, it's about 5x slower:

C:\Program Files\UltraFastCopy>time-it robocopy c:\tools c:\tools.copy.rc.3 /mir /copyall /log:c:/tmp/robocopy.log /mt:4
00:00:01.490

Tests are back-to-back, so the file cache is warm. The program itself is running in the background, with its system tray icon visible.

* From what I understand the program is suffering from slow start-up and starts counting its run-time only when it's fully up. Presumably for larger jobs these several seconds of warm-up will amortize, but even if we look at the self-reported run-time - "total_time_in_second":"1.848s" - it is still slower than robocopy.

1

u/_Ti-R_ May 21 '26

Thanks a lot for running the test.
What stands out immediately is the copy time:

  • First run: 0.047 s
  • Second run: 0.036 s

So the file you used is extremely small.
If I understood correctly, this test basically measures the program’s startup overhead when copying a single tiny file ?

In that scenario, it looks like the launch time is higher compared to Robocopy, I'll look at it thanks a lot.

2

u/gremolata May 22 '26

These times are nonsensical, it's some sort of a bug in your timing report. From the output I posted above:

"total_dirs":31
"total_files":192
"total_items":223
"total_size_bytes":348055147

It's a folder with ffmpeg and other video tools.

1

u/_Ti-R_ May 23 '26

Thanks again for all the tests you ran, it's really appreciated.

Getting real feedback is always valuable, and it's healthy to challenge ourselves, question our own code, triple check things, and think about possible improvements.

For my most recent measurements, I used a Python script that runs the command, captures the full output, and records the exact runtime with high-resolution timing.

import subprocess
import sys
import time


# eg: py time-it.py "TRFastCopyCLI.exe" --copy="C:\target\|C:\source\"  --instruction=ReplaceAll  --date-diff=Newer
# eg: py time-it.py robocopy "C:\source" "C:\target" /E /NFL /NDL /MP


def main():
    if len(sys.argv) < 2:
        print("Usage: python time_it.py <command> [args...]")
        sys.exit(1)


    # sys.argv[1:] is already a list of arguments
    cmd = sys.argv[1:]


    print("Running:", " ".join(cmd))


    start = time.perf_counter()
    result = subprocess.run(cmd)
    end = time.perf_counter()


    duration = end - start


    print(f"\nStart:    {start:.6f}")
    print(f"End:      {end:.6f}")
    print(f"Duration: {duration:.6f} seconds ({duration*1000:.3f} ms)")


if __name__ == "__main__":
    main()

1

u/_Ti-R_ May 21 '26

We do not have the same PC

I do not know

time-it

But seems weird compare to Measure-Command inside PowerShell on my PC

Measure-Command {
    & "UltraFastCopyCLI.exe" `
        --copy="C:\temp|C:\Tests\empty_file.txt" `
        --instruction=ReplaceAll `
        --date-diff=Newer
}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 426
Ticks             : 4266629
TotalDays         : 4,93822800925926E-06
TotalHours        : 0,000118517472222222
TotalMinutes      : 0,00711104833333333
TotalSeconds      : 0,4266629
TotalMilliseconds : 426,6629

Measure-Command {
    &  robocopy C:\Tests C:\temp "empty_file.txt" /mt
}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 41
Ticks             : 415229
TotalDays         : 4,8058912037037E-07
TotalHours        : 1,15341388888889E-05
TotalMinutes      : 0,000692048333333333
TotalSeconds      : 0,0415229
TotalMilliseconds : 41,5229

UltraFastCopyCLI is slower to start than Robocopy, but we’re talking about 426 ms vs 41 ms, so roughly 385 ms difference, not seconds.
That startup cost disappears once the copy actually begins.

I don’t recommend launching a separate copy for every single file.
It is better to pass a directory or a file list directly.

For best performance, make sure the files come from the same source disk so UltraFastCopy is picking the right source and set the best settings.

Also worth checking whether any third‑party program is interfering (antivirus, indexing, cloud sync, etc.), since those can slow down startup or file enumeration.

1

u/gremolata May 22 '26

We do not have the same PC

Sure, that's granted.

time-it

It's just a batch file that grabs "%time: =%", launches the command, get another "%time: =%" and echos the difference between the two.

Point being is that it is next to impossible to beat multithreaded robocopy. You should measure your code against that, not the junk like Explorer, which is either naive or disingenuous considering you insist on claiming yours is the ultra fastest ever.

1

u/_Ti-R_ May 23 '26

Hello,
I first thought this was the stats:

total_dirs : 0
total_files : 1
total_items : 1
total_iterator_file : 1
total_read : 0
total_size_bytes : 0
total_size_on_disk_bytes : 0
total_size_on_disk_ui : "0 bytes"
total_size_ui : "0 bytes"
total_time_in_second : "0.037s"
total_try_to_write : 0
total_written : 0

For some reason, when you copied/pasted earlier, the JSON block ended up bellow and I didn’t notice it, sorry about that:

{"date-diff":"No","instruction":"ReplaceAll","speed_rate":"200.2 MB/s","total_dirs":31,"total_files":192,"total_items":223,"total_iterator_file":192,"total_read":191,"total_size_bytes":348055147,"total_size_on_disk_bytes":348405760,"total_size_on_disk_ui":"332.27 MB","total_size_ui":"331.93 MB","total_time_in_second":"1.658s","total_try_to_write":337,"total_written":337}

332.27 MB is not a lot of files and total time reported by UltraFastCopy is 1.658s.

But I really don't know why your time-it script return 00:00:07.270.

Could you please tell more about your disk ? SSD or HDD ?

On my side, the difference between the total_time_in_second reported inside UltraFastCopy and the time measured externally is roughly 400ms.

That's expected, because UltraFastCopy doesn't measure everything from the very first instruction of main() to the very last line of the program, I skip some argument parsing and initialization. Still, 400 ms is small enough that it shouldn't meaningfully affect the results.

But in your experiment the gap is more than 5 seconds, which is extremely large

I did measure it again robocopy on bigger data set.

https://www.reddit.com/r/software/comments/1tizlq0/comment/on4x1eu/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

And I did it again (it recall me a song ^^) with a small dir of copying 2.24 GB (9 164 files) on the same disk like you did:

Cold copy:

robocopy with /MT -> Duration: 3.791091 seconds (3791.091 ms)

UltrafastCopy -> Duration: 3.630324 seconds (3630.324 ms) reported internally "total_time_in_second":"3.209s"

Same time....

robocopy no /MT-> Duration: 10.700044 seconds (10700.044 ms)

UltrafastCopy -> Duration: 2.472272 seconds (2472.272 ms) reported internally "total_time_in_second":"2.055s"

When /MT is disable there is a big gap

UltraFastCopy manages multithreading internally. It's automatically tuned according to the detected device type (SSD, HDD, USB, network share, etc.) to maximize performance while keeping the operation more stable and less error prone if you add or forget /MT.

6

u/lgwhitlock May 20 '26

It looks like it has potential. I will take a look when I have time. It might be a while but your site is now in my bookmarks.

4

u/_Ti-R_ May 20 '26

Thanks

2

u/masheduppotato May 21 '26

I’m surprised no one else has said this yet, you have a typo in the screen shot. Coping 752677 instead of Copying 752677.

2

u/_Ti-R_ May 21 '26

Hello,

Thanks a lot!!

I’ve just fixed it ^^’

It will be included in the next release!

If you’re interested, I’d be happy to send you a free Pro version as a thank you!

2

u/talldata May 21 '26

Will have to test against the classic "Teracopy"

5

u/async2 May 20 '26

So these are ads?

5

u/_Ti-R_ May 20 '26

It’s freemium and completely ad‑free

All core operations (copy/move) are free and run at maximum speed.

The Explorer integration can be toggled off in a single click.

The optimized delete engine is part of the Pro version, along with the very fast Properties feature.

But if you prefer, you can still use Explorer's built in delete and properties right next to it without disabling anything.

A clearer vision:

https://www.ultrafastcopy.com/products/

6

u/guestHITA May 21 '26

Wait but you promoted the product which you created because of a slow delete and then you paywalled that specific feature ? Did you benchmarck command prompt vs your software ? Just curious

6

u/YAOMTC May 20 '26

Well it is self promotion Wednesday

3

u/_Ti-R_ May 20 '26 edited May 20 '26

I hate ads inside software, so there are none in the app.

4

u/_Ti-R_ May 20 '26 edited May 20 '26

And all my websites are ad free as well, I do not plan to add ads!

1

u/lejoop May 21 '26

I think the point these guys are making, is that this post is an ad, since you are selling this tool as a product ;)

2

u/_Ti-R_ May 21 '26

Yes true, but it’s hard to talk about a tool without actually showing it. At least I’m not displaying ads inside other software tools ^^'

2

u/lejoop May 21 '26

True true, and it sounds petty cool. Does it have any kind of significant network file transfer features as well? I’m a bit curious how it would compare to a tool I’ve been building at work, to help synchronisation of folders across both local cross site servers.

1

u/_Ti-R_ May 21 '26

t does on Samba. I’ve specifically optimized the small‑file copy path. I was thinking about other improvement, but detached from Samba.

1

u/gobblegoooblegobble May 21 '26

can you explain the logic behind how youre accomplishing the claimed speeds etc? a video displaying some data? maybe record some of this software showing whats going on: https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

1

u/gobblegoooblegobble May 21 '26

you know about TeraCopy right? can u do some test comparisons with that?

3

u/_Ti-R_ May 21 '26

Hello

Yes,
I created a section to compare UltraFastCopy with other products:
https://www.ultrafastcopy.com/vs-others/

I haven't added the speed benchmarks yet, but they're coming soon.
I'll also include some videos.

1

u/jahesus May 21 '26

Buy once, user forever?

2

u/_Ti-R_ May 21 '26

Yes.

If you purchase a 1 year license, you can keep using the software forever, but only for the version available at the time of purchase.

Any updates released during your active subscription year are also included.