[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Nochmals: unterschiedliches Verhalten Mac Windows

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Nochmals: unterschiedliches Verhalten Mac Windows

WernerPerplies
Beiträge gesamt: 2762

24. Sep 2013, 18:43
Beitrag # 1 von 7
Bewertung:
(2597 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

mit der folgenden Routine erzeuge ich mehrere Instanzen eines Dateinamens, z. B:

01Fehlerprotokoll.log
02Fehlerprotokoll.log
03Fehlerprotokoll.log

Code
/*string*/function readFileInstances(/*string*/fileName, /*int*/multiInstances) 
{
if (multiInstances==null)
{
gO.logFileName = fileName;
return fileName;
}
var splittetFileName = fileName.splitFileName();
var lengthOfMultininstances = multiInstances.toString().length;
var files = new Array()
for (var i = multiInstances; i>=0; i--)
{
var file = new File(File(splittetFileName.path+ "/" +i.toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension).fullName);
if (file.exists) files.push(file);
}
if (files.length >= multiInstances)
{
// delete highest
files[0].remove();
}
// rename all existing files
for (var i = (files.length-1); i>-1; i--)
{
var file = new File(splittetFileName.path+ "/" +(i+1).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension);
if (file.exists) file.rename(splittetFileName.path+ "/" +(i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension)
}
fileName = splittetFileName.path+ "/" +(1).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension;
gO.logFileName = fileName;
return fileName;
}


Funktioniert unter Windows prima, auf dem Mac gibt es nur eine Datei:
01Fehlerprotokoll.log

Any Ideas?

Vielen Dank

(Dieser Beitrag wurde von WernerPerplies am 24. Sep 2013, 18:55 geändert)
X

Nochmals: unterschiedliches Verhalten Mac Windows

WernerPerplies
Beiträge gesamt: 2762

24. Sep 2013, 19:04
Beitrag # 2 von 7
Beitrag ID: #517721
Bewertung:
(2583 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Oh,

ich glaube, hier habe ich gerade selbst eine Idee, ich denke, ich sollte die Dateinamen sicherheitshalber noch einmal sortieren.

Muss ich mal ausprobieren.


als Antwort auf: [#517718]

Nochmals: unterschiedliches Verhalten Mac Windows

WernerPerplies
Beiträge gesamt: 2762

26. Sep 2013, 13:00
Beitrag # 3 von 7
Beitrag ID: #517790
Bewertung:
(2499 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

dieses Problem hat sich leider nicht erledigt.

Ein vorheriges Sortieren der Dateinamen hat leider nicht geholfen.


als Antwort auf: [#517721]

Nochmals: unterschiedliches Verhalten Mac Windows

zaphodbeeblebroxx
Beiträge gesamt: 408

26. Sep 2013, 22:58
Beitrag # 4 von 7
Beitrag ID: #517812
Bewertung:
(2460 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

leider kann ich die Funktion so nicht auf dem Mac testen, da der Code unvollständig ist. Ich weiß auch nicht, ob ich ganz verstanden habe, was die Funktion machen soll, aber das Umbenennen von bereits existierenden Dateien:

Code
if (file.exists) file.rename(splittetFileName.path+ "/" +(i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension) 


Müsste doch eigentlich so gehen:
Zitat file.rename (newName: string)
Renames the associated file.

newName string: The new file name, with NO path information.


also so:
Code
if (file.exists) file.rename((i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension) 


Das funktioniert zumindest auf dem Mac so.


als Antwort auf: [#517790]
(Dieser Beitrag wurde von zaphodbeeblebroxx am 26. Sep 2013, 23:00 geändert)

Nochmals: unterschiedliches Verhalten Mac Windows

WernerPerplies
Beiträge gesamt: 2762

27. Sep 2013, 10:43
Beitrag # 5 von 7
Beitrag ID: #517823
Bewertung:
(2412 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

zuerst einmal danke.
Zitat leider kann ich die Funktion so nicht auf dem Mac testen, da der Code unvollständig ist. Ich weiß auch nicht, ob ich ganz verstanden habe, was die Funktion machen soll


Die Funktion soll dafür sorgen, das beim Abspeichern unter gleichem Namen eine zuvor definierte Anzahl von Versionen erhalten bleibt und die neueste Version immer mit dem Zähler eins beginnt.

Zitat newName string: The new file name, with NO path information.


Das könnte natürlich sein, ich bin von Windows gewohnt, immer den vollen Pfad anzugeben, weil z. B. auch eine Dateiverschiebung eigentlich nur eine Umbenneung ist und deshalb der volle Zielpfad angegeben werden muss.

Allerdings scheint Deine Version hier auch zu funktionieren.

Da Du geschrieben hast, dass Du meinen Code wegen Unvollständigkeit nicht überprüfen kannst, reiche ich hier eine "kleine" ;-) Testapplikation nach:

Code
// DESCRIPTION Test readFileInstances 
// Dateiname: readFileInstances.jsx
// © 2013 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// created: Fri Sep 27 2013 07:04:24 GMT+0200
#target indesign
String.prototype.fill = function(number){var filled ="";for (var i=0;i<number;++i){filled += this;}return filled;}
String.prototype.padLeft = function(fillc, length)
{if (this.length<length){return (fillc.fill(length-this.length)+this).substr(-length);}return this;}
/*string*/ String.prototype.splitFileName=function()
{
var file = new File(this);
var fn =file.name;
var extension = "";
if (fn.lastIndexOf(".",fn)>0)
{
extension = fn.substr(fn.lastIndexOf(".",fn));
fn=fn.substr(0,fn.lastIndexOf(".",fn));
}
return {path: file.path, fileNameWithExtension: file.name, fileNameWithOutExtension: fn, extension: extension}
}
// globales Object:
var gO = {};
main();
/*string*/function readFileInstances(/*string*/fileName, /*int*/multiInstances)
{
if (multiInstances==null)
{
gO.logFileName = fileName;
return fileName;
}
// split fileName and remove leading figures
var splittetFileName = fileName.splitFileName(true);
var lengthOfMultininstances = multiInstances.toString().length;

var files = new Array()
for (var i = multiInstances; i>=0; i--)
{
var file = new File(File(splittetFileName.path+ "/" +i.toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension).fullName);
if (file.exists) files.push(file);
}
if (files.length >= multiInstances)
{
// delete highest
files[0].remove();
}
// rename all existing files
for (var i = (files.length-1); i>-1; i--)
{
var file = new File(splittetFileName.path+ "/" +(i+1).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension);
if (file.exists)
{
// full name, this is the used way, which works with windows
file.rename(splittetFileName.path+ "/" +(i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension)
// only file name
file.rename((i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension)
}
}
fileName = splittetFileName.path+ "/" +(1).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension;
gO.logFileName = fileName;
return fileName;
}
/*void*/function main()
{
try
{
var dlgWin = createDialogWindow();
dlgWin.show();
/*dialogWindow*/function createDialogWindow()
{
try
{
var dlgWin = new Window("dialog", "Test der Funtion readFileInstances");
dlgWin.targetFolder = null;
dlgWin.counter = 0;
dlgWin.multiInstances = 10;
dlgWin.baseFileName = "Protokolldatei.log";
dlgWin.fileName = dlgWin.baseFileName;
dlgWin.mlEdit = addMultilineEdit(dlgWin);
dlgWin.mlEdit.text = "Jeder Klick erzeugt eine Datei, in diesem Fall maximal 10.\n";
dlgWin.mlEdit.text += "bei Überschreitung dieser Zahl wird die älteste Version gelöscht.\n";
dlgWin.mlEdit.text += "Bei jedem Aufruf der Funktion wird der Zähler in den Dateien inkrementiert "+
dlgWin.mlEdit.text += "und die Dateien entsprechend umbenannt, damit die neueste Version " +
dlgWin.mlEdit.text += "immer in der ersten Datei steht. \n Rückgabewert ist der Dateiname der neuesten Datei: \n\n\n";
var buttons = [
{name: "tfolder", text: "Zielverzeichnis", helpTip: "Zielverzeichnis auswählen", onClick: getTargetFolder},
{name: "save", text: "Datei erzeugen", helpTip: "eine weitere Datei erzeugen", onClick: newFile},
{name: "close", text:"Ok", helpTip: "Fenster schließen", onClick: dlgWinClose}];
dlgWin.btnGroup = addButtonGroup(dlgWin, "panel", buttons);

dlgWin.onShow=function()
{
getTargetFolder();
}
/*void*/function getTargetFolder()
{
var folder = Folder(Folder.myDocuments);
var tF = folder.selectDlg("Zielverzeichnis auswählen:");
if (tF == null)
dlgWin.targetFolder = Folder.myDocuments;
else
dlgWin.targetFolder = tF.fullName;
dlgWin.baseFileName = dlgWin.targetFolder+"/" + dlgWin.baseFileName;
return ;
}
/*void*/function newFile()
{
if (dlgWin.targetFolder != null)
{
dlgWin.fileName = readFileInstances(dlgWin.baseFileName, dlgWin.multiInstances);
if (writeString2File(dlgWin.fileName, (++dlgWin.counter).toString()+"\n"))
{
dlgWin.mlEdit.text += dlgWin.fileName+"\n";
}
}
else
{
alert("Bitte zuerst ein Zielverzeichnis auswählen!");
}
return;
}
/*void*/function dlgWinClose()
{
dlgWin.close()
dlgWin = null;
gO = null;
readFileInstances = null;
}
}
catch (error)
{
throw error;
}
return dlgWin;
}
}
catch (error)
{
alert(error.message + "\ninZeile: " + error.line);
}

/*Object*/function addMultilineEdit(/*object*/toAdd, /*Array*/alignment, /*boolean*/ scrolling, /*boolean*/ enabled)
{
if (enabled == null)
enabled = true;
if (scrolling==null)
scrolling = true;
if (alignment== null)
alignment = ["fill","fill"];
var edText = toAdd.add("edittext", undefined, "", {multiline:true, scrolling: scrolling});
edText.alignment = alignment;
edText.enabled = enabled;
return edText;
}
/*Object*/function addButtonGroup(/*object*/toAdd, /*String*/winPanel, /*Array*/buttons)
{
// addPanelOrGroup(toAdd, [type], [orientation], [alignment], [text], [helpTip], [name]) ;
var bG = addPanelOrGroup(toAdd, "panel", "row", ["center","bottom"], null, null, winPanel) ;
// bG.buttons = new Array(buttons.length);
// bG.buttons = new Array(buttons.length);
bG.buttons = {};
for (var i = 0; i < buttons.length; i++)
{
bG.buttons[i] = {name: buttons[i].name, btn: bG.add("button", undefined, buttons[i].text)};
if (buttons[i].width>0)
bG.buttons[i].btn.maximumSize[0] = buttons[i].width;
bG.buttons[i].btn.helpTip = buttons[i].helpTip;
bG.buttons[i].btn.onClick = buttons[i].onClick;
eval("bG.buttons."+buttons[i].name + "= null");
bG.buttons[buttons[i].name] = bG.buttons[i].btn;
}
return bG;
}
/*Panel/Group*/function addPanelOrGroup(/*object*/toAdd, /*String*/type, /*string*/orientation, /*Array*/alignment,
/*string*/text, /*string*/helpTip, name)
{
// addPanelOrGroup(toAdd, [type], [orientation], [alignment], [text], [helpTip], [name]) ;

if (text == null)
var groupPanel = toAdd.add(type);
else
var groupPanel = toAdd.add(type, undefined, text);
groupPanel.name = text;
if (orientation==null)
orientation = "column"
if (alignment == null)
alignment = ["left","top"];
groupPanel.alignment = alignment;
groupPanel.orientation = orientation;
if (helpTip!=null)
groupPanel.helpTip = helpTip;
if (name!=null)
groupPanel.name = name;
return groupPanel;
}
/*bool*/function writeString2File(fileName, string2Write, encoding)
{
try // writeString2File
{
var file = File (fileName);
if (file==null)
throw new Error("Konnte das Dateiobject nicht erzeugen: \n" + fileName);
if (encoding==null)file.encoding = "UTF-8";
else file.encoding=encoding;
if (!file.open("w"))
throw new Error("Konnte Datei nicht zum schreiben öffnen: \n" + fileName);
if (!(file.write(string2Write)))
throw new Error("Konnte Dateiinhalt nicht schreiben: \n" + fileName);
if (!(file.close()))
{
throw new Error("Konnte Datei nicht schließen: \n" + fileName);
}
return true;
}
catch (error) // writeString2File
{
throw error;
}
return false;
}
}


Die zu prüfende Funktion steht direkt hinter dem main()-Aufruf.

Danke.


als Antwort auf: [#517812]

Nochmals: unterschiedliches Verhalten Mac Windows

zaphodbeeblebroxx
Beiträge gesamt: 408

28. Sep 2013, 01:20
Beitrag # 6 von 7
Beitrag ID: #517859
Bewertung:
(2360 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Werner,

ich habe das nun auf Mac OSX (10.6.8) getestet und das Ergebnis bestätigt meine Vermutung:

Diese Umbenennung von einer Datei funktioniert nicht auf dem Mac:
Code
// full name, this is the used way, which works with windows  
file.rename(splittetFileName.path+ "/" +(i+2).toString().padLeft("0",lengthOfMultininstances) + splittetFileName.fileNameWithExtension)


Man erhält immer nur eine Datei:01Fehlerprotokoll.log

Verwende ich die von mir vorgeschlagene Variante (file.rename() nur mit dem Dateinamen)
Code
// only file name  
file.rename((i+2).toString().padLeft("0", lengthOfMultininstances) + splittetFileName.fileNameWithExtension)


Dann erhalte ich die Log-Dateien:
01Fehlerprotokoll.log
02Fehlerprotokoll.log
03Fehlerprotokoll.log
usw.

Wenn ich in dem Testszenario 2 x 10 Dateien erzeuge, erhalte ich als Ergebnis 10 Logs mit folgendem Inhalt:
01Fehlerprotokoll.log 20
02Fehlerprotokoll.log 19
...
09Fehlerprotokoll.log 12
10Fehlerprotokoll.log 11

Das müsste dem gewünschten Ergebnis entsprechen.


als Antwort auf: [#517823]
(Dieser Beitrag wurde von zaphodbeeblebroxx am 28. Sep 2013, 01:21 geändert)

Nochmals: unterschiedliches Verhalten Mac Windows

WernerPerplies
Beiträge gesamt: 2762

28. Sep 2013, 07:23
Beitrag # 7 von 7
Beitrag ID: #517861
Bewertung:
(2328 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mathias,

vielen Dank für den Test.
Zitat Das müsste dem gewünschten Ergebnis entsprechen.


Ja das tut es, ich werde das Modul in meiner Library entsprechend ändern.


als Antwort auf: [#517859]
X