Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Mit C prüfen ob eine Datei von einem anderen Programm geöffnet ist...

Frage Entwicklung C und C++

Mitglied: Fips81

Fips81 (Level 1) - Jetzt verbinden

04.05.2007, aktualisiert 05.05.2007, 8351 Aufrufe, 2 Kommentare

Einen schönen guten Morgen!

Ich muss über VPN drucken. Da der Druckjob bei Bildern und Texten mit Mustern im spooler so endlos groß wird, und ThinPrint meinem Kunden zu teuer ist, versuche ich das mittels PDF umzusetzen. Auf dem Server wandelt FreePDF die Druckausgabe in ein PDF-File um und legt sie auf einer Freigabe auf dem Heimcomputer ab. Dort überwacht DirMonitor dieses Verzeichnis. Wenn eine PDF-Datei eingeht, leitet DirMonitor diese an (dazwischen eine Batch) PDFP.exe weiter. PDFP druckt diese mittels AcrobatReader v8.0 und schließt den Reader nach erfolgreichem Spoolvorgang.
Soweit funktioniert das auch prima, nur wenn die PDF-Datei "größer" ist, d.h. über 100 kb, dann erkennt DirMonitor die PDF (die aber noch leer ist und durch den langsamen DSL-Upload erst noch gefüllt wird) und leitet die leere Datei an PDFP weiter. Mit dem Ergebnis, das eine Instanz vom Acrobat Reader geöffnet ist und sich nicht mehr schließt, und auch der Druck nicht funktioniert.
Hoffentlich habe ich das verständlich rüber gebracht.

Ich brauche quasi ein Programm, das überprüft, ob die PDF-Datei noch geöffnet ist. Z.B. mittels einem Schreibversuch. Mein erster Fehlversuch war eine Batch:

01.
@echo off 
02.
c:/ 
03.
cd pdfprint/pdfspooler 
04.
for /F "tokens=1,2,3,4 delims=" %%i in (%1) do @set pdffilename="%%l" 
05.
c:/pdfprint/wait.exe 1 
06.
:loop 
07.
ren %pdffilename% %pdffilename% 
08.
if errorlevel 0 goto print 
09.
c:/pdfprint/wait.exe 3 
10.
if errorlevel 1 goto loop 
11.
:print 
12.
c:/pdfprint/pdfp.exe %1 
13.
del %1 /f /s /q
DirMonitor startet die Batch so:
"C:/PDFPrint/PDFP.exe" "C:/PDFPrint/PDFSPOOLER/test.pdf"

Die For-Schleife holt aus "C:/PDFPrint/PDFSPOOLER/test.pdf" den Dateinamen "test.pdf" mit Anführungszeichen.

Mein Gedanke war, andauernd zu versuchen die Datei umzubenennen (in den selben Namen) und mit errorlevel zu arbeiten. So lange die Datei "befüllt" wird, soll errorlevel 1 kommen. Mit rename funktioniert das auch, wenn ich die Schritte einzeln in der Kommandozeile durchgehe, aber in der Batch nicht mehr.

Jetzt brauche ich eine Lösung mittels eines Kommandozeilen-Befehls um den errorlevel zu erzeugen, oder lieber wäre es mir mittels eines C-Programms (deswegen habe ich es in der Rubrik C/C++ gepostet).
Ich bin gerade dabei C zu lernen und kenne nur die Grundlagen. Habe mir bereits folgendes Progrämmchen gebastelt:

01.
#include <stdio.h> 
02.
#include <stdlib.h> 
03.
int main (int argc, char *argv[])  
04.
05.
      FILE *datei; 
06.
      datei = fopen ( argv[1] , "w+" ); 
07.
      if (datei == NULL ) { 
08.
                          return EXIT_FAILURE; 
09.
10.
      else { 
11.
           return EXIT_SUCCESS; 
12.
13.
}
Das Programm erzeugt den errorlevel 1 aber nur wenn es die Datei nicht erstellen kann. Da sie aber schon existiert muss das Programm irgendwie erkennen, ob die Datei vollständig ist, bzw. nicht mehr durch Windows geöffnet ist.

Genau... Windows... eben hab' ich es erwähnt. Betriebssystem ist Windows XP. ;)

Für eine Lösung bin ich riesig dankbar!

Mit freundlichen Grüßen, Michael

PS: Entschuldigung für den langen Text!


edit: WO SIND DIE BACKSLASHE? Ich musste sie durch slashs ersetzen, ich kriegs nicht hin.
Mitglied: Guenni
04.05.2007 um 19:01 Uhr
@Fips81

Hi,

der Datentyp FILE ist ja eine Struktur. Unter anderem enthält
diese Struktur ein Dateiende- und ein Fehler-Flag:

01.
typedef struct{ 
02.
 
03.
... 
04.
 
05.
unsigned int flags; /* Dateiende- und Fehlerflag */ 
06.
 
07.
... 
08.
 
09.
}FILE;
Fehler können mit der Funktion int ferror(FILE* f) abgefragt werden. Die Funktion
liefert einen Wert ungleich Null, wenn in(mit) f ein Fehler aufgetreten ist.

Habe ich gerade mal nachgeschlagen, aber WELCHE Fehler das sein könnten,
steht leider nicht in dem Buch.

Ich würde mir 2 Programme schreiben:

Eins, das eine Datei öffnet, und in einer Schleife die Datei mit Werten füllt.

Ein anderes, das die Datei ebenfalls öffnet(öffnen will), während das erste
Programm noch läuft, und dann mal gucken, was passiert.

Ist ein bißchen TRYandERROR, aber manchmal muß man halt ein
wenig experimentieren.

Grüße
Günni
Bitte warten ..
Mitglied: Fips81
05.05.2007 um 01:08 Uhr
Hi Günni, riesen Dank für Deine Mühen!

Ich denke, damit kann ich mir weiteres Wissen zu ferror ergoogeln.

Heute Abend habe ich es soweit zum laufen gebracht. Halt mit Batch, aber es erfüllt seinen Zweck.
Schaun mer mal, vielleicht kann ich's nächste Woche noch ein wenig mit C optimieren...

Falls die Lösung jemand interessiert, kann ich sie gerne komplett posten! ...Einstellungen von FreePDF, DirMonitor und die Batches.

Ich hab's auch schon auf Stress getestet, d.h. durcheinander gedruckt, mehrere Sachen in rauhen Mengen gleichzeitig gedruckt. Soweit alles fehlerfrei und ohne Absturz. Und vor allem: 100 mal schneller!

Hier vorweg mal die Batch vom Server und die "Haupt-Batch" vom Client (backslashs ersetzt durch slashs):

Server:
01.
@echo off 
02.
for /F "tokens=1,2,3,4 delims=/" %%i in (%1) do @set pdffilename=%%l 
03.
if errorlevel 1 @for /F "tokens=1,2,3,4 delims=\" %%i in ("%1") do @set pdffilename=%%l 
04.
e: 
05.
cd /spooler/temp 
06.
copy "%pdffilename%" "//%2/%3/%random%%random% %pdffilename%" 
07.
del %1 /f /s /q
Client:
01.
@echo off 
02.
for /F "tokens=1,2,3,4 delims=/" %%i in (%1) do @set pdffilename="%%l" 
03.
c: 
04.
cd "/pdfprint/pdfspooler" 
05.
 
06.
:check 
07.
ping 127.0.0.1 -n 5 
08.
ren %pdffilename% %pdffilename% 
09.
if not exist %1 goto:eof 
10.
if %errorlevel% equ 0 (goto print) else (goto check) 
11.
 
12.
:print 
13.
c:/pdfprint/pdfp.exe %1 
14.
del %1 /f /s /q
Wie gesagt, bei Interesse poste ich's komplett.
Mit freundlichen Grüßen, Michael
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...