Hallo,
unter Windows Vista muss ich Dateien verlängern, damit diese eine durch
4 teilbare Dateilänge haben (also 4,8,12).
Bisher erledige ich das mit einem Lua-Progrämmchen, aber es sollte auch
auf Rechnern ohne Lua-Installation laufen.
J. Wa. schrieb:> Wie könnte man das erledigen?
mit C, C#, VB, Perl - was hast du denn zur verfügung? Und was kannst du?
Mit viel fingerbrech sollte das sogar als batch gehen.
> was hast du denn zur verfügung?
es soll mit Batch-Programmen oder Powershell laufen.
Auf keinen Fall mit Skripten, die eine Installation verlangen (Ruby,
Perl, ...)
J. Wa. schrieb:> Auf keinen Fall mit Skripten, die eine entsprechende Installation> verlangen (Ruby, Perl, ...)
bei perl kann man einfach die exe mit hinlegen, braucht keine
installation.
1. In den meisten Sprachen gibt es die Möglichkeit die Größe einer
Datei zu ermitteln.
2. Modulo 12 (z.B. %) drauf loslassen.
3. Wenn == 0 Glücklich werden.
Wenn != 0 Weiter.
4. Öffnen zum Anhängen (append).
5. (12 - Divisionsrest) Bytes anhängen.
6. Tür zu es zieht.
> bei perl kann man einfach die exe mit hinlegen,
dieses äußerst triviale Problem kann man schnell mit C, C#, ...
erledigen,
aber ich möchte keine Exe
In einer Linux-Shell könnte ich es schnell erledigen.
Es muss doch unter Windows irgendeinen Befehl geben ??
>1. In den meisten Sprachen gibt es die Möglichkeit die Größe einer> Datei zu ermitteln.>2. Modulo 12 (z.B. %) drauf loslassen.>3. Wenn == 0 Glücklich werden.> Wenn != 0 Weiter.>4. Öffnen zum Anhängen (append).>5. (12 - Divisionsrest) Bytes anhängen.>6. Tür zu es zieht.
Da hast du aber schön mein obiges Lua-Programm dokumentiert. Brave
Fleißarbeit, aber das nützt mir absolut nix.
J. Wa. schrieb:> Es muss doch unter Windows irgendeinen Befehl geben ??
ja "einfach" im Batch
dir machen -> datei größe lesen
je nach dateigröße auffüllen
echo 'x' >> datei
> dir machen -> datei größe lesen
das ganze sollte automatisch gehen innerhalb eines übergeordneten
Skripts (*.bat)
> echo 'x' >> datei
ausprobiert: damit wird die Datei gleich um 6 Bytes länger. 'x' besteht
aus 3 Zeichen, \r und \n kommt auch dazu, macht zusammen 5 Bytes. Woher
das 6. Byte kommt weiß ich nicht, eines der Geheimnisse von Windows.
J. Wa. schrieb:>> echo 'x' >> datei>> ausprobiert: damit wird die Datei gleich um 6 Bytes länger. 'x' besteht> aus 3 Zeichen, \r und \n kommt auch dazu, macht zusammen 5 Bytes. Woher> das 6. Byte kommt weiß ich nicht,> eines der Geheimnisse von Windows.
Dafür isses aber bunt ;-)
Mal im Ernst, CMD.EXE ist nicht wirklich für ernsthaftes Arbeiten
gedacht.
Vielleicht kann man es mit Basteln irgendwie halbstabil hinbekommen,
aber ist es wirklich das was du willst?
Da gabs doch mal so ein Paket von Microsoft 'Windows Services for UNIX'
zum nachinstallieren.
Die wussten schon warum sie so etwas anbieten;-)
J. Wa. schrieb:>> echo 'x' >> datei>> ausprobiert: damit wird die Datei gleich um 6 Bytes länger. 'x' besteht> aus 3 Zeichen, \r und \n kommt auch dazu, macht zusammen 5 Bytes. Woher> das 6. Byte kommt weiß ich nicht, eines der Geheimnisse von Windows.
man könnte ja einfach mal reinschauen was drin steht?
du kannst dir auch 3 Dateien anlegen mit jeweil 1, 2 oder 3 bytes drin.
cat dummy1 >> datei
oder
cat dummy2 >> datei
oder ...
aber wieder nicht getestet, ich würde mir einfach ein programm
schreiben.
Versuchs mal damit:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
struct stat sb;
unsigned int div;
int rc = 0;
FILE *fp;
while (argc-- > 1)
{
if (NULL != (fp = fopen(*(++argv), "ab")))
{
fstat(fileno(fp), &sb);
div = sb.st_size % 4;
for (; div < 4 && div > 0; ++div)
putc(0, fp);
fclose(fp);
}
else
{
fprintf(stderr, "Kann Datei %s nicht öffnen.\n",
*argv);
rc = 1;
}
}
return rc;
}
Das ist fast dasselbe wie Dein LUA Programm, nur in Ansi C.
Checke mal deine Definition von st_size - das kann auf Deinem System ein
32bit Wert sein. Das führt dann zu einem Problem bei Dateien > 4GB.
Auf 64bit Systemen sollte das kein Problem mehr sein.
Gruß Hans.
Vielen Dank für die Mühe, auch wenn C hier nicht meine Präferenz ist.
Bei vielen Problemchen ist kompilierter Code einfach unpraktisch.
Z.b. Irgendwann muss die Dateilänge durch 8 oder was anderes teilbar
sein.
-> Der Programmierer, der das C-Programm erstellt hat, ist verschwunden,
Urlaub, oder findet den Source nicht mehr, und und und ...
Dann gibt es manche Vorsichtsmassnahmen, dass fremde Exe-Programme gar
nicht ausgeführt werden dürfen.
Ich hätte mir sowas vorgestellt, was z.B. bei jedem Linux-System auf
Anhieb funktioniert:
1
#!/bin/bash
2
fname=$1
3
siz=`stat-c%s$fname`
4
mod4=$(($siz%4))
5
if[$mod4-gt0];then
6
addbyte=$((4-$mod4))
7
while[$addbyte!=0];do
8
#echo $addbyte
9
echo-en'\0'>>$fname
10
addbyte=$(($addbyte-1))
11
done
12
fi
Gibt es es WIndows nicht die Möglichkeit, sowas ähnliches zu schreiben?
Das Problem ist doch wirklich ganz einfach!
Der Kollege hat das C-Programm schon auf dem Tablet serviert, von dort
aus wäre es nicht mehr weit, dem Programm ein "Vielfaches-von"-Argument
noch mitzugeben.
Alternativ kannst es noch mit dem Windows Scripting Host (WSH)
versuchen. Der ist seit Windows 2000 Bestandteil des Systems und bei
Admins i.d.R. das Werkzeug der Wahl für solche Sachen. JScript oder
VBScript, du hast die Wahl. Argumente parsen, danach das
FileSystemObject zum Dateizugriff nutzen (
http://msdn.microsoft.com/en-us/library/6kxy1a51(v=vs.84).aspx ). Alles
kein Hexenwerk.
>FileSystemObject zum Dateizugriff nutzen (>http://msdn.microsoft.com/en-us/library/6kxy1a51(v... ). Alles>kein Hexenwerk.
Danke für den Hinweis. Genau sowas suchte ich.
Ich kannte WSH nur vom Hörensagen, aber das scheint eine sehr
interessante Sache zu sein.
Leider kann FileSystemObject nur mit Text-Dateien opererieren.