AnsweredAssumed Answered

How do I check if a PDF file is read only?

Question asked by Tim Lewis on Nov 18, 2015
Latest reply on Nov 18, 2015 by Tim Lewis

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:


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
                 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.