Clutch
Clutch

Reputation: 189

If FileExists delete another file

I am trying to add a sub-routine to a VBScript. In short, I am trying to see if one type of file exists, it will delete another file.

There will be files like:

SOCAL_CU59_res.dxf 
SOCAL_CU59_main.dxf 
SOCAL_CU59_mot.dxf
SOCAL_CU59_motl.dxf

but on occassion there may be a file with an "x" at the end of the filename:

SOCAL_CU59_resx.dxf
SOCAL_CU59_mainx.dxf 
SOCAL_CU59_motx.dxf
SOCAL_CU59_motlx.dxf

They would all be in the same folder. The "x" file has priority. So if it exist I want to delete the matching file file without the "x".

Here is what I have so far but errors. The check filesize routine I added works great but it's after that I am having no luck:

Dim oFSO, sDirectoryPath, oFOLDER, oFile
Set oFSO = CreateObject("Scripting.FileSystemObject")
sDirectoryPath = "S:\SOCAL\Section_11\Road DXFs\"

RecurseFolders sDirectoryPath

Sub RecurseFolders(sFolder)
  'Here we set the oFolder object, note that its variable scope is within
  'this sub, so you can set it many times and it's value will only be
  'that of the sub that's currently running.
  Set oFolder = oFSO.GetFolder(sFolder)

  'Here we are looping through every file in the directory path.
  For Each oFile In oFolder.Files
    'This just checks for a file size less than 100Kb
    If oFile.Size <= 1085 And Right(LCase(oFile.Name),3) = "dxf" Then
      oFile.Delete True
    End If
  Next

  For Each oFile In oFolder.Files
    'This checks if there is a file with an 'x' at the end of filename
    If FileExists (Right(oFile.Name),1) = "x" Then
      oFile.Delete True
    End If
  Next

  'Here we do the recursive bit. We need to loop through each folder in
  'the directory too and call the same sub to ensure we check every folder
  'in the path.
  For Each oFolder In oFolder.SubFolders
    RecurseFolders oFolder.Path
  Next
End Sub

The script creates both files, but does not delete the file that does NOT have the "x". The error says for line 204, Char 5:

Wrong number of arguments or invalid property assignment: 'Right'

The line the error refers to is: If FileExists (Right(oFile.Name),1) = "x" Then.

Upvotes: 1

Views: 1020

Answers (2)

Nilpo
Nilpo

Reputation: 4816

You have a few inherent problems that you need to correct in order to do this properly. First, you need to make the parenthesis correction mentioned by Ansgar Wiechers. Second, you should remove the duplicate loop. There's no need to loop over all of the files multiple times. Finally, you should store the files to be deleted until after the loop has finished. Deleting a file while it is in the file set that is currently being looped over could produce unexpected results or unexplained errors.

With that said, here's how I would approach this. You'll note all of the corrections I've mentioned.

Dim oFSO, sDirectoryPath, oFOLDER, oFile
Set oFSO = CreateObject("Scripting.FileSystemObject")
sDirectoryPath = "S:\SOCAL\Section_11\Road DXFs\"
Dim arrFilesToDelete()  'an empty dynamic array to hold files to be deleted later
Dim i = 0               'an iterator used to track the array pointer

RecurseFolders sDirectoryPath
DeleteExtraFiles arrFilesToDelete

Sub RecurseFolders(sFolder)
    'Here we set the oFolder object, note that its variable scope is within
    'this sub, so you can set it many times and it's value will only be
    'that of the sub that's currently running.
    Set oFolder = oFSO.GetFolder(sFolder)

    'Here we are looping through every file in the directory path.
    For Each oFile In oFolder.Files
        'Is the file a "dxf" file
        If LCase(Right(oFile.Name)) = "dxf" Then
            'This just checks for a file size less than 100Kb
            If oFile.Size <= 1085 And Right(LCase(oFile.Name),3) = "dxf" Then

            End If

            'This checks if there is an 'x' at the end of filename
            If LCase(Right(oFile.Name) 5) = "x.dxf" Then
                'if so, store its counterpart for deletion later
                sBadFile = Replace(oFile.Name, "x.dxf", ".dxf")
                ReDim Preserve arrFilesToDelete(i)
                arrFilesToDelete(i) = oFile.Path & "\" & sBadFile
                i = i + 1
            End If
        End If
    Next

    'Here we do the recursive bit. We need to loop through each folder in
    'the directory too and call the same sub to ensure we check every folder
    'in the path.
    For Each oFolder In oFolder.SubFolders
        RecurseFolders oFolder.Path
    Next
End Sub

Sub DeleteExtraFiles(arrFiles)
    For Each sFile in arrFiles
        If oFSO.FileExists(sFile) Then
            oFSO.DeleteFile sFile
        End If
    Next
End Sub

Upvotes: 1

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200293

You put the inner closing parenthesis in the wrong place. The parameter 1 belongs to the function Right. Change this:

If FileExists (Right(oFile.Name),1) = "x" Then

into this:

If FileExists (Right(oFile.Name,1)) = "x" Then

With that said, there might be other issues with that line. VBScript doesn't have a built-in function FileExists and your code snippet doesn't reveal if that function is implemented elsewhere in your code, so whether passing it a character and comparing its return value to the character x actually makes sense is hard to say.

If you meant to use the FileSystemObject method FileExists you'd need to call it from the actual FileSystemObject instance:

If oFSO.FileExists(...) Then

and pass it a filename or path, not a single character or a boolean value.

If you want to test if for any given file foo.ext another file foox.ext exists, and in that case delete foo.ext you'd do something like this:

For Each oFile In oFolder.Files
  xFilename = oFSO.GetBaseName(oFile) & "x." & oFSO.GetExtensionName(oFile)
  If oFSO.FileExists(oFSO.BuildPath(oFile.Parent, xFilename)) Then
    oFile.Delete True
  End If
Next

Upvotes: 0

Related Questions