A few months ago I wrote a blog titled Using FrontPage 2003 to Bulk Rename Images Using VBA, in which I shared a VBA macro that renamed all of the images in a website to a common file-naming syntax. In that blog I explained my reasoning behind my use of the long-outdated FrontPage 2003, and that reason was that FrontPage's "Link Fix Up" feature replicates file renames across your entire website. This single feature can greatly reduce your development time for websites when you have a lot of renaming to do.
Recently I ran into another interesting situation where combining with FrontPage's VBA and "Link Fix Up" features saved me an incredible amount of time, so I thought that I would share that in today's blog.
Problem Description and Solution
I recently inherited a large website with thousands of images that were spread across dozens of folders throughout the website. Unfortunately, this website was created by several developers, so there were a large number of duplicate images scattered throughout the website.
It would have taken me several days to remove all of the duplicates and edit all of the HTML in the web pages, so this seemed like a task that was better suited for automation in FrontPage 2003.
VBA Bulk Image Moving Macro
The following VBA macro for FrontPage 2003 will locate every image in a website, and it will move all images to the website's root-level "images" folder if they are not already located in that folder:
Public Sub MoveImagesToImagesFolder()
Dim objFolder As WebFolder
Dim objWebFile As WebFile
Dim intCount As Integer
Dim strExt As String
Dim strRootUrl As String
Dim strImagesUrl As String
Dim blnFound As Boolean
' Define the file extensions for image types.
Const strValidExt = "jpg|jpeg|gif|bmp|png"
' Define the images folder name.
Const strImagesFolder = "images"
With Application
' Retrieve the URL of the website's root folder.
strRootUrl = LCase(.ActiveWeb.RootFolder.Url)
' Define the root-level images folder URL.
strImagesUrl = LCase(strRootUrl & "/" & strImagesFolder)
' Set the initial search status to not found.
blnFound = False
' Loop through the root-level folders.
For Each objFolder In .ActiveWeb.RootFolder.Folders
' Search for the images folder.
If StrComp(objFolder.Url, strImagesUrl, vbTextCompare) = 0 Then
' Exit the loop if the images folder is found.
blnFound = True
Exit For
End If
Next
' Test if the images folder is missing...
If blnFound = False Then
' ... and create it if necessary.
.ActiveWeb.RootFolder.Folders.Add strImagesFolder
End If
' Loop through the collection of images.
For Each objWebFile In .ActiveWeb.AllFiles
' Retrieve the file extension.
strExt = LCase(objWebFile.Extension)
' Test if the file extension is for an image type.
If InStr(1, strValidExt, strExt, vbTextCompare) Then
' Test if the image is in the root-level images folder...
If StrComp(objWebFile.Parent, strImagesUrl, vbTextCompare) <> 0 Then
' ... and move the file if it is not.
objWebFile.Move strImagesUrl & "/" & objWebFile.Name, True, True
End If
End If
Next
End With
End Sub
In Closing...
This macro is pretty straight-forward, but there are a couple of parameters that I pass to the WebFile.Move()
method which I would like to point out. The first parameter for the Move()
is the destination URL, which should be obvious, but the second and third parameters should be explained:
- The second parameter is set to True in order to update hyperlinks during the move process; this is the "Link Fix Up" feature.
- The third parameter is set to True in order to overwrite duplicate files; this has the potential to be a destructive operation if you are not careful. In my situation that was acceptable, but you might want to double-check your content first.
Another thing to note is that you can easily update this macro to move other file types. For example, you could move all of the JavaScript files in your website to a common root-level "scripts" folder by changing the values of the strValidExt
and strImagesFolder
constants.
As always, have fun... ;-]
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/