ds-blue-logo
Preview  |  SOLIDWORKS USER FORUM
Use your SOLIDWORKS ID or 3DEXPERIENCE ID to log in.
TLTim Lewis18/11/2015

I am using the most recent version of SolidWorks 2015 Professional, and would like to check to see if a PDF file is read only.  So far, I've tried three approaches with no success.

Approach #1: Catching the "Permission Denied" Error (Source)

Function IsFileOpen1(filename As String) As Boolean

    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.

    filenum = FreeFile()   ' Get a free file number.

    ' Attempt to open the file and lock it.

    Open filename For Input Lock Read As #filenum

    Close filenum          ' Close the file.

    errnum = Err           ' Save the error number that occurred.

    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.

    Select Case errnum

        ' No error occurred.

        ' File is NOT already open by another user.

        Case 0

         IsFileOpen1 = False

        ' Error number for "Permission Denied."

        ' File is already opened by another user.

        Case 70

            IsFileOpen1 = True

        ' Another error occurred.

        Case Else

            Error errnum

    End Select

End Function

The problem with this is that the error is not captured.  Specifically, I get the following error on line #07:

Capture.JPG

I don't understand why VBA isn't obeying the "On Error Resume Next" command.

Approach #2: Use the "GetAttr()" Command to Check if the File Is Read Only (Source)

Function IsFileOpen2(filename As String) As Boolean

    With CreateObject("Scripting.FileSystemObject")

        If .FileExists(filename) Then

            If GetAttr(filename) And vbReadOnly Then

                 IsFileOpen2 = True

            Else

                 IsFileOpen2 = False

            End If

    End With

End Function

The problem here is that the GetAttr function always returns "32" (i.e. "vbArchive" or "File has been changed since last backup") whether the file is open or not.  To be clear, at no point have I ever seen it be equal to "0" (i.e. "vbNormal" or "Normal") or "1" (i.e. "vbReadOnly" "Read-only").

Approach #3: Use Outputs from the "SaveAs" Command to Check if SolidWorks Was Successful in Saving the File (Source)

Dim exportData As SldWorks.ExportPdfData, status As Boolean, nErrors As Long, nWarnings As Long

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc

Set exportData = swApp.GetExportFileData(swExportPdfData)

exportData.ExportAs3D = True

FilePath = Replace(swModel.GetPathName, ".sldprt", " (3D).pdf", 1, -1, vbTextCompare)

status = swModel.Extension.SaveAs(FilePath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, exportData, nErrors, nWarnings)

If Not status Then

    MsgBox "PDF creation failed."

End If

The problem is that whether the file is indeed read-only or not, the value returned to "status" is always "False", and the value of "nErrors" is always "swGenericSaveError".

Ultimately, if the file is not open, the PDF is saved successfully, but I want to be able to warn the user that the file failed to save, if that does happen.