Harry Spier
Harry Spier

Reputation: 1425

Removing binary zero from a string

I've had to move a whole directory structure (thousands of directories and files) from the Mac to the PC, but now on the PC for some reason some of the folder names have a character on the end of value binary zero ( a few have this in the middle). I need to clean this up since it crashes a macro which tries to read these directories.
I've tried the following code in a vba-word macro using the Replace function (as part of a larger program that walks through the directory tree) but the Replace function doesn't seem to catch chr(0) .

Set current_folder = fso.GetFolder(source_folder.Path)
current_folder_name = current_folder.Name
cleaned_folder_name = Replace(current_folder_name, Chr(0), " ")
Selection.TypeText "Old directory name: " & current_folder_name
Selection.TypeParagraph
Selection.TypeText "New directory name: " & cleaned_folder_name
Selection.TypeParagraph
If current_folder_name <> cleaned_folder_name Then
    current_folder.Name = cleaned_folder_name
End If

I've also tried: cleaned_folder_name = Replace(current_folder_name, Chr(0), " ", 1, -1, vbBinaryCompare)

How I can get the Replace function to replace binary 0 in a string by a blank.

Or does anyone knows a different approach to cleaning up these directory and file names that would work.

Thanks, Harry

Upvotes: 0

Views: 304

Answers (3)

darekk
darekk

Reputation: 81

In my case Replace() and InStr() don't work with Chr(0) (can't see it not displaying any error), but this removal can be done for example this way:

If Mid$(str, 1, 1) = Chr$(0) Then str = Mid$(str, 2)
If Mid$(str, Len(str), 1) = Chr$(0) Then str = Left$(str, Len(str) - 1)

This is Null removal from ends, for example from objFile.ExtendedProperty("Dimensions") value, like "?600 x 400?". Nulls (?) are insterted here in Windows 10 but not in Windows XP.

Upvotes: 1

Chrismas007
Chrismas007

Reputation: 6105

You can write a custom loop function to determine what character you are having issues with:

OldFolderName = source_folder.Path
For x = 0 To 255
    If InStr(OldFolderName, Chr(x)) > 0 Then
        MsgBox "Chr(" & x & ") is found at position " & InStr(OldFolderName, Chr(x))
    EndIf
Next x

Upvotes: 0

Chrismas007
Chrismas007

Reputation: 6105

This should do it:

Dim OldFolderName As String, NewFolderName As String

OldFolderName = source_folder.Path
If InStr(OldFolderName, Chr(0)) > 0 Then
    'NewFolderName = Application.Clean(OldFolderName) 'Works on some versions
    NewFolderName = Application.WorksheetFunction.Clean(OldFolderName) 'By Gene Skuratovsky
    Name OldFolderName As NewFolderName
End If

Edit2: Probably best to use the Clean() method.

Upvotes: 1

Related Questions