Pregunta

He construido una pequeña aplicación de WPF que permite a los usuarios cargar documentos y luego seleccionar uno para mostrar.

El siguiente es el código de la copia del archivo.

    
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();
}
    

El archivo es copiado sin incidentes. Sin embargo, cuando el usuario intenta seleccionar un archivo que acaba de copiar en pantalla, un archivo no encontrado una excepción. Después de la depuración, he encontrado que la UriSource para la imagen dinámica es la resolución de los archivos '{}' archivo seleccionado ruta relativa al directorio que acaba de ser visitadas por el archivo seleccione en el código anterior en lugar del directorio de aplicaciones ya que parece debiera.

Este problema sólo se produce cuando se selecciona un archivo recién copiado. Si reinicia la aplicación y seleccionar el nuevo archivo que trabaja muy bien.

Aquí está el código que establece dinámicamente la Fuente de la imagen:

    
//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;
}
    

Estoy perplejo. se agradecería alguna de pensamiento.

¿Fue útil?

Solución 2

Resulta que yo estaba perdiendo una opción en el constructor de mi openfiledialogue. El diálogo se cambia el directorio actual que estaba causando las rutas relativas para resolver de forma incorrecta.

Si reemplaza el archivo abierto con lo siguiente:


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

El problema se ha resuelto.

Otros consejos

A pesar de que no tengo una respuesta directa, se debe tener cuidado para esas personas que permiten subir archivos. Yo estaba en un seminario donde tenían buena vs malos piratas informáticos para simular hazañas de la vida real. Uno de ellos era tal que los archivos se les permitió ser subido. Se cargan los archivos maliciosos y ASP.NET llaman los archivos directamente a medida que nuevos donde las imágenes se presentan en última instancia a los usuarios, y fueron capaces de tomar el tiempo más de un sistema. Es posible que desee comprobar de alguna manera lo que se está permitiendo tipos de archivos y tal vez se han almacenado en un directorio no exeucting de su servidor web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top