Respuesta

26

De acuerdo con la respuesta aceptada en this post, no hay otra manera en este momento. Sin embargo, el equipo de File IO está considerando cambiar la API para que devuelva null en lugar de lanzar una excepción.

Cita en el mensaje vinculado:

Actualmente, la única manera de comprobar si existe un archivo es para coger el FileNotFoundException . Como se ha señalado, tener un cheque explícito y la apertura es una condición de carrera y, como tal, no espero que exista ningún archivo que contenga API. Creo que el equipo de File IO (no estoy en ese equipo, así que no estoy seguro, pero esto es lo que escuché ) está considerando tener este retorno de API nulo en lugar de arrojar si el archivo no lo hace existe.

+2

creo que la nueva propiedad isAvailable en Windows 8.1 aborda este. – satur9nine

+0

@ satur9nine - Gracias, eso es bueno saberlo. Todavía no he tenido la oportunidad de investigar las 8.1 API. – keyboardP

+4

ApplicationData.Current.LocalFolder.TryGetItemAsync (fileName) puede hacer el truco ahora. No se requieren más procedimientos de excepción feos. Recuerde que esta es también una llamada pendiente. – RBT

1

Traté de escribir mis propias utilizando viejos trucos:

  1. GetFileAttributesEx() siempre parece terminar con ERROR_ACCESS_DENIED si el archivo seleccionado a través de FileOpenPicker;
  2. Id. Para FindFirstFileEx();
  3. _stat() siempre termina con ENOENT cuando el archivo se selecciona a través de FileOpenPicker;
  4. CreateFile2() con la opción CREATE_NEW funciona: si el archivo existe, fallará con INVALID_HANDLE_VALUE return value y ERROR_FILE_EXISTS último error; si el archivo no existe, debe recordar eliminar el archivo creado posteriormente.

En general, es mejor seguir con el método de manejo de excepciones.

3

Puede utilizar la vieja llamada Win32 como este para probar si el directorio existe o no:

GetFileAttributesExW(path, GetFileExInfoStandard, &info); 

return (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false: true; 

Funciona de escritorio y Metro aplicaciones: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

+0

Esto parece ser el truco, ¡muchas gracias! – McGarnagle

+0

¿De dónde viene FILE_ATTRIBUTE_DIRECTORY? Probé esta función, y funciona, pero no veo cómo. ¡Gracias! –

13

Esto puede ser viejo, pero parece como si hubieran cambiado cómo quieren que te acerques a esto.

Se supone que debes intentar hacer el archivo, luego retroceder si el archivo ya existe. Here es la documentación en él. Estoy actualizando esto porque este fue el primer resultado en mi búsqueda de Google para este problema.

Entonces, en mi caso, quiero abrir un archivo, o crearlo si no existe. Lo que hago es crear un archivo y abrirlo si ya existe. De este modo:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists); 
+4

Esto solo funciona si intenta crear un archivo con un nombre único. Si solo está comprobando la existencia del archivo, obviamente no querrá hacer esto. –

2

Los otros medios para comprobar es por conseguir los archivos en la carpeta local

var collection = ApplicationData.Current.LocalFolder.GetFilesAsync() 

El uso de este método y luego iterar sobre todos los elementos de la colección y comprobar su disponibilidad.

+9

Compruebe la clave de bloqueo de mayúsculas. –

+2

Por favor no "grite". –

3

Microsoft ha añadido una nueva función para StorageFile en Windows 8.1 para permitir que los ingenieros de usuario para determinar si se puede acceder a un archivo: IsAvailable

+0

No compatible con _Windows * Teléfono * 8.1_, solo _Windows 8.1_. No sé a qué MS está jugando. –

7

me encontré con este post del blog de Shashank Yerramilli que proporciona una respuesta mucho mejor.

He probado esto para Windows Phone 8 y funciona. No se han probado en Windows Store, aunque

estoy copiando la respuesta aquí

Para Windows RT aplicación:

public async Task<bool> isFilePresent(string fileName) 
{ 
    var item = await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName); 
    return item != null; 
} 

para Windows Phone 8

public bool IsFilePresent(string fileName) 
{ 
    return System.IO.File.Exists(string.Format(@"{0}\{1}", ApplicationData.Current.LocalFolder.Path, fileName); 
} 

Check if a file exists in Windows Phone 8 and WinRT without exception

+0

"El tipo o el nombre del espacio de nombres 'Archivo' no existe en el espacio de nombres 'System.IO' (¿falta una referencia de ensamblado?)" – Mike

+0

¿Qué tipo de aplicación está tratando de usar en Windows Phone 8 o Windows RT? Aplicación? – Jap

+0

Una aplicación universal para Windows/Phone store que apunta a 8.1. Además, mientras esté aquí: su función WP8 debería simplemente devolver un bool, y no necesita la palabra clave async tampoco. – Mike

0

La documentación para TryGetItemAsync dice: "Este ex muestra cómo verificar la existencia de un archivo ". Parece que esta API tiene la intención oficial de servir para ese propósito.

1

8.1 tengo algo como esto, lo intenté funcionó.

var folder = ApplicationData.Current.LocalFolder; 
var file = await folder.TryGetItemAsync("mytext.txt") as IStorageFile; 

if (file == null) 
{ 
    //do what you want 
} 
else 
{ 
    //do what you want 
} 

http://marcominerva.wordpress.com/2013/11/19/how-to-check-if-a-file-exists-in-a-windows-8-1-store-apps-no-more-exception-handling/

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

1
Dim myPath As StorageFolder 
    If (From i In Await KnownFolders.MusicLibrary.GetFoldersAsync() Where i.Name = "PodBong").Count = 1 Then 
     myPath = Await KnownFolders.MusicLibrary.GetFolderAsync("PodBong") 
    Else 
     myPath = Await KnownFolders.MusicLibrary.CreateFolderAsync("PodBong") 

    End If 
+0

Este código verificará la carpeta sin usar y la excepción. – HippieGeek

Cuestiones relacionadas