podwójne \\ jak usunąć z adresu

0

Witam.

Mam taki kod:

string apppath = Path.GetDirectoryName(Application.ExecutablePath) + @"\images\";
MessageBox.Show(Path.GetDirectoryName(Application.ExecutablePath),"Path");
MessageBox.Show(apppath, "apppath string");
File.Copy(openFileDialog1.FileName, apppath + filename, true);

i jak daję zatrzymanie kodu na file.copy przy debugowaniu to w messagebox'ach wyświetla mi prawidłowo ścieżkę do pliku np. "C:\windows\system32\images". Jeżeli pliku nie ma w apppath+filename to kopiuje go ale jeżeli jest plik o takiej nazwie to nie zastępuje. Jak najadę na zmienna apppatch to mi pokazuje ścieżkę taką "C:\windows\system32\images\" co zapewne jest przyczyną nie nadpisywania. Jak uzyskać adres bez podwójnych \ ?

1

To nie tak. Podwójne backslashe są OK.
Chodzi o to, że można w stringu zapisać znak specjalny - np. \t (tabulator), \n (znak nowej linii). I jak teraz ma kompilator odróżnić, czy ty chciałeś napisać znak nowej linii, czy po prostu chciałeś napisać "\n"?

string s1 = "\n"; //to jest znak nowej linii string s2 = "\\n"; //a to jest string "\n" string s3 = @"\n"; //a to jest to samo co s2

string path1 = "C:\windows"; // wyświetlenie tego w messageboxie pokaże: "C:\windows"
string path2 = @"C:\windows"; //to jest tym samym, co path1
string path3 = "C:\windows"; //a to się nie skompiluje

0

No dobrze, ja wiedziałem jak działa @ i \ ale może źle to napisałem o co mi chodzi.
Mam taki kod:

string filename = openFileDialog1.SafeFileName;
string apppath = Path.GetDirectoryName(Application.ExecutablePath) + @"\images\";
string destFile=apppath+filename;
File.Copy(openFileDialog1.FileName, destFile, true)

Uznałem, że problem jest z \\, ale może jednak nie. Tylko powiedzcie dlaczego File.Copy się wykona, jeżeli w destFile nie ma pliku o takiej nazwie, a jeżeli jest to go nie nadpisuje/zamienia?

0

U mnie to działa, tzn. nadpisuje. Może to kwestia uprawnień? Czy plik który próbujesz nadpisać jest w tym czasie używany przez inny program?

0

Prawdę powiedziawszy, wygląda jakby powinno działać. Nie rzuca ci żadnego wyjątku? Może coś trzyma plik?

0

Jeżeli nie ma wyjątku odmowa dostępu, to piszesz:

Debug.WriteLine(destFile);

i sprawdzasz ścieżkę. Ewentualnie piszesz test jednostkowy (albo też sprawdzasz w kodzie) np. tak:
http://stackoverflow.com/questions/3137097/how-to-check-if-a-string-is-a-valid-windows-directory-folder-path

0
endrique napisał(a):

Może to kwestia uprawnień? Czy plik który próbujesz nadpisać jest w tym czasie używany przez inny program?

Uprawnienia są pełne na obu plikach, nie jest używany, nawet w moim programie. W nie których przypadkach wyświetlam obraz ale w tym fragmencie co testuję z tym kodem nie jest wyświetlany.

@niezalogowany
Wg mnie ścieżka jest poprawna skoro kopiuje, jak pliku nie ma. Ścieżka się nie zmienia w zależności czy jest plik w katalogu docelowym czy go nie ma. Pokazuje tylko, że plik we wskazanej lokalizacji już istnieje.

Zrobiłem obejście, poprzez usunięcie najpierw pliku, a później skopiowanie.

if (File.Exists(destfile) == true)
     {
          DialogResult dr = MessageBox.Show("Plik, który wczytujesz ma taką samą nazwę, jak plik katalogu programu.\n Chcesz nadpisać istniejący plik?", "Błąd, powielenie plików.", MessageBoxButtons.YesNo);
          if (dr == DialogResult.Yes)
          {
               File.Delete(destfile);
               File.Copy(openFileDialog1.FileName, destfile);
          }
     }

ale to są dodatkowe linie kodu, który mógłby być krótszy :) To działa bez problemu.

0
damian302 napisał(a):

... ale to są dodatkowe linie kodu, który mógłby być krótszy ...

to go skróć:

if
  (
    (File.Exists(destfile))
    ||
    (MessageBox.Show("Plik, który wczytujesz ma taką samą nazwę, jak plik katalogu programu.\n Chcesz nadpisać istniejący plik?", "Błąd, powielenie plików.", MessageBoxButtons.YesNo)==DialogResult.Yes)
  )
  {
   File.Delete(destfile);
  }
File.Copy(openFileDialog1.FileName, destfile);
0

@_13th_Dragon
dzięki ale skrócenie kodu to miałem na myśli wykorzystanie

File.Copy(openFileDialog1.FileName, destfile, true);

który u mnie nie chce działać z niewiadomych mi przyczyn.

Poza tym przeczytaj temat na czym polega problem, bo nie chce mi się pisać po raz kolejny tego samego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1