Frage

Ich habe eine kleine WPF -Anwendung erstellt, mit der Benutzer Dokumente hochladen und dann eine zum Anzeigen auswählen können.

Das Folgende ist der Code für die Dateikopie.

    
public static void MoveFile( string directory, string subdirectory)
{
    var open = new OpenFileDialog {Multiselect = false, Filter = "AllFiles|*.*"};
    var newLocation = CreateNewDirectory( directory, subdirectory, open.FileName);

    if ((bool) open.ShowDialog())
        CopyFile(open.FileName, newLocation);
    else
        "You must select a file to upload".Show();
}

private static void CopyFile( string oldPath, string newPath)
{
 if(!File.Exists(newPath))
  File.Copy(oldPath, newPath);
 else
  string.Format("The file {0} already exists in the current directory.", Path.GetFileName(newPath)).Show();
}
    

Die Datei wird ohne Zwischenfälle kopiert. Wenn der Benutzer jedoch versucht, eine Datei auszuwählen, die er gerade kopiert hat, ist eine Ausnahme keine Datei gefunden. Nach dem Debuggen habe ich festgestellt, dass die Urisource für das dynamische Bild die relativen Pfaddateien {ausgewählte Datei} 'in das Verzeichnis, das gerade von der Datei ausgewählt wurde, im obigen Code anstelle des Anwendungsverzeichnisses wie es scheint es sollte.

Dieses Problem tritt nur auf, wenn eine neu kopierte Datei ausgewählt wird. Wenn Sie die Anwendung neu starten und die neue Datei auswählen, funktioniert sie gut.

Hier ist der Code, der die Bildquelle dynamisch festlegt:

    
//Cover = XAML Image
Cover.Source(string.Format(@"Files\{0}\{1}", item.ItemID, item.CoverImage), "carton.ico");

...

public static void Source( this Image image, string filePath, string alternateFilePath)
{
    try
 {image.Source = GetSource(filePath);}
    catch(Exception)
 {image.Source = GetSource(alternateFilePath);}
}

private static BitmapImage GetSource(string filePath)
{
    var source = new BitmapImage();
    source.BeginInit();
    source.UriSource  = new Uri( filePath, UriKind.Relative);
    //Without this option, the image never finishes loading if you change the source dynamically.
    source.CacheOption = BitmapCacheOption.OnLoad;
    source.EndInit();
    return source;
}
    

Ich bin ratlos. Jeder Denken würde geschätzt.

War es hilfreich?

Lösung 2

Es stellte sich heraus, dass mir eine Option im Konstruktor meines OpenFiledialogue fehlte. Der Dialog veränderte das aktuelle Verzeichnis, das dazu führte, dass die relativen Pfade falsch gelöst wurden.

Wenn Sie die geöffnete Datei durch Folgendes ersetzen:


var open = new OpenFileDialog{ Multiselect = true, Filter = "AllFiles|*.*", RestoreDirectory = true};

Das Problem ist gelöst.

Andere Tipps

Obwohl ich keine direkte Antwort habe, sollten Sie vorsichtig sein, damit die Leute Dateien hochladen können. Ich war in einem Seminar, in dem sie gute gegen schlechte Hacker hatten, um das wirkliche Leben zu simulieren. Einer war so, dass Dateien hochgeladen werden durften. Sie haben böswillige ASP.NET -Dateien hochgeladen und die Dateien direkt aufgerufen, um neu zu sein, wo die Bilder letztendlich den Benutzern präsentiert wurden, und konnten schließlich ein System übernehmen. Möglicherweise möchten Sie irgendwie überprüfen, welche Arten von Dateien zulässig sind, und haben möglicherweise in einem nicht-ausgebildeten Verzeichnis Ihres Webservers gespeichert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top