hilfdirselbst.ch
Facebook Twitter gamper-media
WernerPerplies
Beiträge: 2177
24. Sep 2013, 18:43
Beitrag #1 von 7
Bewertung:
(2371 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


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

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
(Dieser Beitrag wurde von WernerPerplies am 24. Sep 2013, 18:55 geändert)
Top
 
X
WernerPerplies
Beiträge: 2177
24. Sep 2013, 19:04
Beitrag #2 von 7
Beitrag ID: #517721
Bewertung:
(2357 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


Oh,

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

Muss ich mal ausprobieren.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517718] Top
 
WernerPerplies
Beiträge: 2177
26. Sep 2013, 13:00
Beitrag #3 von 7
Beitrag ID: #517790
Bewertung:
(2273 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


Hi,

dieses Problem hat sich leider nicht erledigt.

Ein vorheriges Sortieren der Dateinamen hat leider nicht geholfen.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517721] Top
 
zaphodbeeblebroxx p
Beiträge: 408
26. Sep 2013, 22:58
Beitrag #4 von 7
Beitrag ID: #517812
Bewertung:
(2234 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


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.


Matthias
als Antwort auf: [#517790]
(Dieser Beitrag wurde von zaphodbeeblebroxx am 26. Sep 2013, 23:00 geändert)
Top
 
WernerPerplies
Beiträge: 2177
27. Sep 2013, 10:43
Beitrag #5 von 7
Beitrag ID: #517823
Bewertung:
(2186 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517812] Top
 
zaphodbeeblebroxx p
Beiträge: 408
28. Sep 2013, 01:20
Beitrag #6 von 7
Beitrag ID: #517859
Bewertung:
(2134 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


 
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.


Matthias
als Antwort auf: [#517823]
(Dieser Beitrag wurde von zaphodbeeblebroxx am 28. Sep 2013, 01:21 geändert)
Top
 
WernerPerplies
Beiträge: 2177
28. Sep 2013, 07:23
Beitrag #7 von 7
Beitrag ID: #517861
Bewertung:
(2102 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Nochmals: unterschiedliches Verhalten Mac Windows


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#517859] Top
 
X