|
|
|
VBA(Word) Размер файла - условие продолжения кода.
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Программа создает пдф файл, используя ghostscript. В коде после создания .pdf из .ps идет удаление .ps чтобы не захламлять диск. Проблемма в том что файл удаляется прежде чем программа конвертатор (ghostscript) успевает отработать, и в результате .pdf получается пустой и вылетает ошибка программы конвертатора о том что файл .ps не найден. Решил поставить проверку на размер .pdf (так как данный файл в момент начала работы не имеет размера, и статус о его размере появляется только когда ghostscript отработает), что бы знать когда файл окончательно будет создан и можно будет удалять .ps но возникла проблемма - пока файл не будет создан окончательно будет вываливаться ошибка на строчке которая получает размер файла. Вот полный код программы: Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Public Declare Function CloseHandle Lib "kernel32" () Dim FSys As New FileSystemObject Sub Конвертация() On Error GoTo ErrHendler Dim dName As String Dim iNameas As String Dim lRetVal As Long Dim fName As String Dim MyString As String Dim MyLen As String Static TCount As Variant Dim AnyString As String Dim MyStr As String Const iTitle = "Конвертация" If IsEmpty(TCount) Then TCount = 1 Else TCount = TCount + 1 End If dName = "Temp" & CStr(TCount) With Application.Dialogs(wdDialogFileSaveAs) .Name = dName .Format = wdNormal lRetVal = .Display iName = .Name End With If lRetVal <> -1 Then MsgBox prompt:="Отмена", Title:=iTitle Else MyString = "" + iName + "" MyLen = Len(MyString) AnyString = "" + iName + "" MyStr = Left(AnyString, MyLen - 4) fName = MyStr dPrinter = ActivePrinter ActivePrinter = "Ancor Postscript" Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ Collate:=True, Background:=False, printtofile:=True, PrintZoomColumn:=0, _ PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0, _ OutputFileName:="" + fName + "" + ".ps" RetVal = Shell("C:\gs\gs8.14\bin\gswin32.exe -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" + fName + ".pdf -dBATCH " + fName + ".ps") process_handle = OpenProcess(SYNCHRONIZE, 0, lRetVal) If process_handle <> 0 Then WaitForSingleObject process_handle, INFINITE CloseHandle process_handle ActivePrinter = dPrinter End If Set qn = FSys.GetFile("C:\" + fName + "" + ".pdf") If qn.Size > 0 Then Kill "" + fName + "" + ".ps" Else GoTo ErrHendler End If End If Exit Sub ErrHendler: MsgBox prompt:="Ошибка" End Sub Set qn = FSys.GetFile("C:\" + fName + "" + ".pdf") - На этой строчке появляется ошибка, так как файл еще не создан (программа конвертатор еще не успела отработать), хотя эконка файла уже появляется. Если в этот момент удалить .ps то программа конвертатор выдаст ошибку о том, что файл .ps не найден. Как сделать цикл, который будет работать до тех пор, пока ошибка не исчезнит. Смысл в том, что как только мы можем получить размер файла, или просто строчка Set qn = FSys.GetFile("C:\" + fName + "" + ".pdf") отрабатывает без ошибки - мы знаем что файл уже создан и программа конвертатор отработала успешно, мы можем перейти к строчке - Kill "" + fName + "" + ".ps" Как это можно сделать? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2004, 13:55:49 |
|
||
|
VBA(Word) Размер файла - условие продолжения кода.
|
|||
|---|---|---|---|
|
#18+
Вместо SHELL используй WaitForProcessToEnd т.е. WaitForProcessToEnd "C:\gs\gs8.14\bin\gswin32.exe -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" + fName + ".pdf -dBATCH " + fName + ".p Объявление программы Private Const INFINITE = &HFFFF Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, _ ByVal fInherit As Integer, ByVal hObject As Long) As Long '--------- запуск внешней программы и ожидание ее окончания Public Sub WaitForProcessToEnd(cmdLine As String) Dim retVal As Long, pID As Long, pHandle As Long pID = Shell(cmdLine) pHandle = OpenProcess(&H100000, True, pID) retVal = WaitForSingleObject(pHandle, INFINITE) End Sub (писал SergeySV) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2004, 15:07:52 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2168664]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
6ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
19ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 284ms |

| 0 / 0 |
