Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA(Word) Размер файла - условие продолжения кода. / 3 сообщений из 3, страница 1 из 1
26.10.2004, 13:55:49
    #32754916
Gotar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA(Word) Размер файла - условие продолжения кода.
Доброго времени суток.

Программа создает пдф файл, используя 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" Как это можно сделать?

Заранее спасибо.
...
Рейтинг: 0 / 0
01.11.2004, 15:07:52
    #32763311
gacol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA(Word) Размер файла - условие продолжения кода.
Вместо 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)
...
Рейтинг: 0 / 0
04.11.2004, 21:27:21
    #32769672
Gotar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA(Word) Размер файла - условие продолжения кода.
Огромное спасибо... Разобрался с этим вопросом.... Чего только уже не перепробовал...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA(Word) Размер файла - условие продолжения кода. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]