Improvements in interface and functionality

As far as accessibility goes, here's what I see wrong.

First of all, the tree view of options doesn't seem to read what's checked and unchecked anymore. It used to be the case that checking or unchecking an option caused it to be read the next time it was selected, but no longer. I don't know what sort of control is being used inside the tree view, but it doesn't seem to be a standard Windows control.

Second, the buttons for various options are read as buttons, and also don't indicate whether something is checked or not. Again, I don't know what sort of buttons these are, but they're definitely not standard check boxes.

These are the only glaring accessibility issues I've seen. The easiest way to fix them that I can think of would be to use standard controls.

On 2/15/2018 at 12:43, Stephen Piriform said:
<div class="ipsQuote_contents">
	<p>
		Still open to all feedback and ideas for improving CCleaner's interface.
	</p>
</div>

It would be nice if you could add "secure file deletion" to Windows Context Menu (right click menu) which could be used on the selected files or folders.

Recently I lost a code card used for online banking. I ordered a new one and in some unlikely way I lost that one as well. Upon receiving the third code card I scanned in onto my computer and stored it inside my password manager where it should be securely encrypted. However, the original scanned file of the code card is still in the output folder of my scanner. In order to securely delete this file with CC-Cleaner I could move it to the trash can and right click and run CC-Cleaner. However, as the file is not on the same physical hard drive as my operating system, I'm not sure if the file will be securely deleted from its original folder when it's been moved first, or if it's just made invisible to the operating system in its original location, as if I had deleted it without using CC-Cleaner? Another option would be to open the CC-Cleaner interface, and go to "options" -> "include" -> "add" and browse to the file on the computer, and then run CC-Cleaner. This, however, is a long process.

So I hope you'll consider adding secure file deletion to Windows Context Menu :)

1 hour ago, TSJD said:
<div class="ipsQuote_contents">
	<p>
		It would be nice if you could add "secure file deletion" to Windows Context Menu (right click menu)
	</p>
</div>

That's been asked about many times over the years. There are other standalone tools that work very well to do it in the meantime.

1 hour ago, Andavari said:
<div class="ipsQuote_contents">
	<p>
		That's been asked about many times over the years. There are other standalone tools that work very well to do it in the meantime.
	</p>
</div>

Thanks for the info Andavari. I'm new to this forum, so I didn't know. I wonder why they haven't added this functionality, if it has been a recurring request over the years? It seems like something that would be simple to implement. Yes, indeed you are correct. I've searched around today and found other software which could integrate into Windows Context Menu, so I could delete my scan of the code card without first having to move the file to the trash can. I still think it would be nice to have this functionality added to CC-Cleaner though. Thanks!

On 4/9/2018 at 16:00, TSJD said:
<div class="ipsQuote_contents ipsClearfix">
	<p>
		Thanks for the info Andavari. I'm new to this forum, so I didn't know. I wonder why they haven't added this functionality, if it has been a recurring request over the years? It seems like something that would be simple to implement. Yes, indeed you are correct. I've searched around today and found other software which could integrate into Windows Context Menu, so I could delete my scan of the code card without first having to move the file to the trash can. I still think it would be nice to have this functionality added to CC-Cleaner though. Thanks!
	</p>
</div>

We have been working on this internally but have trouble making it work correctly if you want to select multiple files and then perform this action on all of them (the technical reason is too complicated to summarise). Can I ask you and others on this board what your preference is between:

  1. Right-click context menu support for secure deletion 'soon', but only for single files at a time?
  2. Right-click context menu support for secure deletion 'much later', but for both single files and also multiple-files at a time?

2.

However it would be multiple files and folders.

I realize allot of shell extensions, or even drag 'n' drop secure delete programs can have issues working correctly 100% of the time as in sometimes a file is shredded correctly but the shredded file is left on the disk and not deleted from view.

what is the issue? if you want it to apply to all files, you have to add a hive to HKEY CLASSES ROOT/* which is basic enough.

EX:

HKEY_CLASSES_ROOT\123\shell\********

HKEY_CLASSES_ROOT\123\shell\********\command


@=C:\Program Files\********folder\********.EXE %1

This was an unfinished test mock(15 years ago or just under i think) i used that allowed a user to download CCleaner, install & uninstall context menus and upload multiple files to image shack.



Imports DX
Imports Rhino.Mocks
Imports Rhino.Mocks.Constraints
Imports Xunit
Imports Xunit.Extensions

' Tests the ShellContextMenuProcess class.
Public Class TestShellContextMenuProcess

    <Fact()> _
    Public Sub SetProcessManager_ProcessManagerIsNull_Throws()
        Dim expectedExceptionType As Type = GetType(ArgumentNullException)

        Dim exceptionWasThrown As Boolean
        Try
            Dim sut As New ShellContextMenuProcess()
            sut.SetProcessManager(Nothing)
        Catch ex As Exception
            exceptionWasThrown = True
            Assert.IsType(expectedExceptionType, ex)
        End Try

        Assert.True(exceptionWasThrown, "Exception was not thrown.")
    End Sub
    <Fact()> _
    Public Sub StartInstall_Invariant_UsesRegisterArgument()
        Dim sut As New ShellContextMenuProcess()
        Dim expectedMode As String = "register"
        Dim processManagerMock As ProcessManager = New ProcessManagerMockThatExpectsModeArgument(expectedMode)
        sut.SetProcessManager(processManagerMock)

        sut.Install()

        CType(processManagerMock, ProcessManagerMockThatExpectsModeArgument).Verify()
    End Sub

    <Fact()> _
    Public Sub StartUninstall_Invariant_UsesUnregisterArgument()
        Dim sut As New ShellContextMenuProcess()
        Dim expectedMode As String = "unregister"
        Dim processManagerMock As ProcessManager = New ProcessManagerMockThatExpectsModeArgument(expectedMode)
        sut.SetProcessManager(processManagerMock)

        sut.Uninstall()

        CType(processManagerMock, ProcessManagerMockThatExpectsModeArgument).Verify()
    End Sub

    <Fact()> _
    Public Sub WaitForExit_Success_ReturnsTrue()
        Dim expectedValue As Boolean = True
        Dim sut As New ShellContextMenuProcess()
        Dim processManagerStub As ProcessManager = New ProcessManagerStubThatReturnsSpecificExitCode(ShellContextMenuProcess.SuccessCode)
        sut.SetProcessManager(processManagerStub)

        Dim actualValue As Boolean = sut.Install()

        Assert.Equal(expectedValue, actualValue)
    End Sub

    <Fact()> _
    Public Sub WaitForExit_Failure_ReturnsFalse()
        Dim expectedValue As Boolean = False
        Dim sut As New ShellContextMenuProcess()
        Dim processManagerStub As ProcessManager = New ProcessManagerStubThatReturnsSpecificExitCode(ShellContextMenuProcess.FailureCode)
        sut.SetProcessManager(processManagerStub)

        Dim actualValue As Boolean = sut.Install()

        Assert.Equal(expectedValue, actualValue)
    End Sub


    ' Handwritten mock that tests that the Arguments property is set and it has the expected mode.
    Private Class ProcessManagerMockThatExpectsModeArgument
        Inherits ProcessManager

        Private Const ExpectedNumberOfArguments As Integer = 2
        Private _expectedMode As String
        Private _propertyWasSet As Boolean

        Public Sub New(ByVal expectedMode As String)
            MyBase.New("asdf")
            _expectedMode = expectedMode
            _propertyWasSet = False
        End Sub

        Public Overrides Property Arguments() As String()
            Get
                Return MyBase.Arguments
            End Get
            Set(ByVal value As String())
                Assert.Equal(ExpectedNumberOfArguments, value.Length)
                Assert.Equal(_expectedMode, value(1))
                MyBase.Arguments = value
                _propertyWasSet = True
            End Set
        End Property

        Public Sub Verify()
            Assert.True(_propertyWasSet, "Arguments was not set.")
        End Sub

        ' Always returns success
        Protected Overrides Function GetExitCodeCore() As Integer
            Return ShellContextMenuProcess.SuccessCode
        End Function

        Protected Overrides Sub StartProcess()
            ' Do nothing, we don't need to start a process for tests.
        End Sub

        Protected Overrides Sub WaitForExitCore()
            ' Do nothing.
        End Sub
    End Class

    ' ProcessManager stub that returns a desired exit code and has no other logic.
    Public Class ProcessManagerStubThatReturnsSpecificExitCode
        Inherits ProcessManager

        Private _exitCode As Integer

        Public Sub New(ByVal exitCode As Integer)
            MyBase.New("asdf")
            _exitCode = exitCode
        End Sub

        Protected Overrides Function GetExitCodeCore() As Integer
            Return _exitCode
        End Function

        Protected Overrides Sub StartProcess()
            ' Do nothing.
        End Sub

        Protected Overrides Sub WaitForExitCore()
            ' Do nothing
        End Sub
    End Class
End Class


Imports DX
Imports Xunit
Imports Xunit.Extensions
Imports Rhino.Mocks

' Tests the ShellContextMenuInstaller class.
Public Class TestShellContextMenuInstaller

    <Fact()> _
    Public Sub Install_Failure_ReturnsFalse()
        Dim expectedValue As Boolean = False
        Dim sut As New ShellContextMenuInstaller()
        Dim processStub As ShellContextMenuProcess = New ShellContextMenuProcessStub_ReturnsSpecificValue_FromGetWaitForExit(expectedValue)
        sut.SetProcess(processStub)

        Dim actualValue As Boolean = sut.Install()
        Assert.Equal(expectedValue, actualValue)
    End Sub

    <Fact()> _
    Public Sub Install_Success_ReturnsTrue()
        Dim expectedValue As Boolean = True
        Dim sut As New ShellContextMenuInstaller()
        Dim processStub As ShellContextMenuProcess = New ShellContextMenuProcessStub_ReturnsSpecificValue_FromGetWaitForExit(expectedValue)
        sut.SetProcess(processStub)

        Dim actualValue As Boolean = sut.Install()
        Assert.Equal(expectedValue, actualValue)
    End Sub

    <Fact()> _
    Public Sub Uninstall_Failure_ReturnsFalse()
        Dim expectedValue As Boolean = False
        Dim sut As New ShellContextMenuInstaller()
        Dim processStub As ShellContextMenuProcess = New ShellContextMenuProcessStub_ReturnsSpecificValue_FromGetWaitForExit(expectedValue)
        sut.SetProcess(processStub)

        Dim actualValue As Boolean = sut.Uninstall()
        Assert.Equal(expectedValue, actualValue)
    End Sub

    <Fact()> _
    Public Sub Uninstall_Success_ReturnsTrue()
        Dim expectedValue As Boolean = True
        Dim sut As New ShellContextMenuInstaller()
        Dim processStub As ShellContextMenuProcess = New ShellContextMenuProcessStub_ReturnsSpecificValue_FromGetWaitForExit(expectedValue)
        sut.SetProcess(processStub)

        Dim actualValue As Boolean = sut.Uninstall()
        Assert.Equal(expectedValue, actualValue)
    End Sub

    Private Class ShellContextMenuProcessStub_ReturnsSpecificValue_FromGetWaitForExit
        Inherits ShellContextMenuProcess

        Private _expectedValue As Boolean

        Public Sub New(ByVal expectedValue As Boolean)
            MyBase.New()
            _expectedValue = expectedValue
            Dim mocks As New MockRepository()
            SetProcessManager(mocks.Stub(Of ProcessManager)("asdf"))
        End Sub

        Public Overrides Function GetTargetPath() As String
            Return ""
        End Function

        Protected Overrides Function WaitForExit() As Boolean
            Return _expectedValue
        End Function
    End Class
End Class

Passing a List(of Q off to a task factory, for instance, is nothing to you guys. Whats the issue? I understand each new file would be sent to a new instance, so this leaves us with a couple options I know

which ain't pretty like me

1) SEND TO PATH: Nasty ain't it. No commands would be needed but.....yes let's move on from that one.

2) could CC work with MultiSelectModel verb..... Too tired to look into this but it's how video plays work. I think.

3) let me write the class for you in VB.Net <a href="http://www.vbforums.com/member.php?113656-ident" rel="external nofollow">http://www.vbforums.com/member.php?113656-ident</a>

Why are you posting all that code? It makes little sense to do so!