AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) CopyFile Datei wird nicht überschrieben

CopyFile Datei wird nicht überschrieben

Ein Thema von Dennis07 · begonnen am 11. Okt 2015 · letzter Beitrag vom 22. Okt 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
455 Beiträge
 
Delphi 11 Alexandria
 
#1

CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 18:26
Hallo,
ich habe mal wieder ein Problem. Und zwar möchte ich eine Datei Kopieren und gegebenenfalls überscheiben.
Hierzu nutze ich die Funktion "CopyFile(...)".
Ich weise den Parameter "FailIfExists" durch das ergebnis eines MessageDlg's zu.
Das ganze sieht wie Folgt aus:

Delphi-Quellcode:
var
  Index: Integer;
  NewFolder: String;
  FailIfExists: Boolean;
begin
  NewFolder := GetEnvironmentVariable('USERPROFILE') + '\Documents\';
  for Index := 0 to ListBox1.Items.Count - 1 do
  begin
    if ListBox1.Selected[Index] = True then
    begin
      if FileExists(NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')) = True then
      begin
        FailIfExists := (MessageDlg('Die Datei "' + ListBox1.Items.Strings[Index] + '" existiert bereits.' + sLineBreak + 'Soll diese überschieben werden?',mtWarning,mbYesNo,0) <> mrYes);
      end;
      CopyFile(PChar(CurrentFolder + '\' + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')),PChar(NewFolder + ChangeFileExt(ListBox1.Items.Strings[Index],'.txt')),FailIfExists);
    end;
  end;
Es wird eine Datei kopiert, falls die Zieldatei nicht vorhanden ist. Außerdem wird die Variable "FailIfExists" korrekt zugewiesen (True, falls die Datei nicht überschrieben werden soll und False, falls die Datei überschrieben werden soll). Allerdings wird die Datei, auch wenn "FailIfExists" auf False steht, nicht überschrieben. "RaiseLastOSError" zeigt nichts verdächtiges an und es wird auch in den virtualisierten Verzeichnissen nichts angelegt.

Könnte mir jemand sagen, woran dies liegt?

Danke!
Dennis
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.546 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 18:46
Ich kann zwar im Moment nicht testen, aber solche Konstrukte wie

if ListBox1.Selected[Index] = True then kommen nicht immer gut.
Nimm einfach

if ListBox1.Selected[Index]then bei allen boolschen Vergleichen.
Das kommt bei dir öfters vor.

Auch sollte man, wenn man eine Variable mehrmals verwendet, diese erst einmal zwischenspeichern. Das erhöht die Übersicht.
Beispielsweise kommt
ListBox1.Items.Strings[Index] öfters vor.
Nimm eine lokale Variable, bsp.
Filename := ListBox1.Items.Strings[Index] und ersetze die weiteren Abfragen dann immer mit Filename.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain

Geändert von zeras (11. Okt 2015 um 18:49 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
455 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 18:58
Ja, grundsätzlich ist das aber egal.
Außerdem habe ich bereits überprüft, "FailIfExists" ist/wird korrekt gesetzt. Daran liegt es nicht. Die "CopyFile"-Methode ansich scheint Probleme zu machen.
Dennis
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.546 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 19:00
Ja, grundsätzlich ist das aber egal.
Da wirst du im Forum etliche Einträge finden, dass es NICHT egal ist!
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
455 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 19:18
Ich meinte damit nicht, dass es "komplett egal" sei, sondern dass es für dieses Szenario keinen Unterschied macht. Und das stimmt auch. Das ganze hat afaik nur eine auswirkung auf manche API-Sachen wegen der BOOL-Boolean-Inkompatibilität. Bei nativer VCL ist das aber soweit ich weiß sowieso irrelevant. Und wenn man die Vergleiche mit True weglässt, kommt man ja auch aufs selbe Ergebnis. Nähmlich, dass CopyFile nicht überschreibt.
Dennis
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.546 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 19:35
Ändere doch mal die letzte Zeile Copyfile wie unten beschrieben und schaue dir die Strings an. Dann wirst du merken, dass deine Dateinamensangaben nicht passen. Du nimmst gleich den neuen Namen, anstatt den Quellnamen.

Delphi-Quellcode:

var

  s1, s2: String;


....
     s1 := CurrentFolder + '\' + ChangeFileExt(fName,'.txt');
      s2 := NewFolder + ChangeFileExt(fName,'.txt');
      if not CopyFile(PChar(s1), PChar(s2), FailIfExists)then
  ShowMessage('Fehler beim Erstellen der Kopie!'#13#10 + SysErrorMessage(GetLastError));
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
455 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 19:44
Nein. Hatte aber bereits auch schon gesagt, dass kein Fehler auftritt und die Funktion "True" zurückgibt. Trotzdem wird die Datei nicht überschrieben.
Und die Namen passen soweit. Beim erstmaligen Kopieren (wo die Zieldatei ja noch nicht existiert) passt es ja auch und die Datei wird problemlos kopiert.
Dennis
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.546 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 20:03
Und was bringt ShowMessage hinter dem Copyfile?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
455 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 20:13
Wie ich bereits sagte: Es wird nicht aufgerufen, wenn die Datei noch nicht existiert oder wenn diese überscrhieben werden soll.
Und wenn diese nicht überschrieben werden soll, dann wird ShowMessage aufgerufen und zeigt an, dass die Zieldatei bereits existiert und deswegen nicht Kopiert werden kann.
Also soweit alles im grünen Bereich ohne Auffälligkeiten.
Nur, wird die Datei halt nicht überschrieben, wenn sie das eigentlich sollte.
Dennis
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.546 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: CopyFile Datei wird nicht überschrieben

  Alt 11. Okt 2015, 20:26
Wenn Copyfile nicht erfolgreich ist, muss ShowMessage aufgerufen werden mit

SysErrorMessage(GetLastError)); Da siehst du, warum das fehlschlug.
Bitte deinen Code entsprechend ändern, wie von mir oben beschrieben und die Meldung posten.

Außerden wird FailIfExists nicht initialisiert. Das sollte auch gemacht werden.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf