Forum: PC-Programmierung Datei auf eine DWORD-Boundary (4-Byte) vergrößern


von J. W. (nuernberger)


Lesenswert?

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.
1
local fh=io.open(arg[1],"rb")
2
local fs=fh:read("*all*")
3
fh:close()
4
local l=fs:len()
5
if l%4 ~= 0 then
6
  local l2= l-l%4+4
7
  print(l,l2)
8
  local fh=io.open(arg[1],"wb")
9
  fh:write(fs)
10
  for i=l,l2-1 do fh:write('\0') end
11
  fh:close()
12
end

Wie könnte man das erledigen?

von Peter II (Gast)


Lesenswert?

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.

von J. W. (nuernberger)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von amateur (Gast)


Lesenswert?

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.

von J. W. (nuernberger)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von J. W. (nuernberger)


Lesenswert?

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

von Norbert (Gast)


Lesenswert?

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;-)

von Peter II (Gast)


Lesenswert?

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.

von Hans Müller (Gast)


Lesenswert?

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.

von J. W. (nuernberger)


Lesenswert?

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 -gt 0 ]; 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!

von Alex (Gast)


Lesenswert?

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.

von J. W. (nuernberger)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.