Evitar guardar archivo que no sea del mismo tipo(extensión) de mi aplicación.
Publicado por HAROLD ALONSO QUINTERO PINEDA (18 intervenciones) el 24/04/2017 23:13:31
Muy buenas tardes a todos:
Estoy creando una aplicación de ejemplo, y ya he podido realizar los métodos Save,SaveAs,Open y New. La extensión que estoy usando es de tipo ".exa". Ahora, lo que deseo es que el usuario al intentar guardar un archivo que actualmente trabaja en uns instancia de mi aplicación, y que intente sobreescribir un archivo que sea de otro tipo de extensión(.pdf,etc...), en el componente SaveFileDialog, no me permita hacerlo. Muestro el código que tengo implementado en el método Save.
Espero me puedan ayudar. Muchas gracias.
Estoy creando una aplicación de ejemplo, y ya he podido realizar los métodos Save,SaveAs,Open y New. La extensión que estoy usando es de tipo ".exa". Ahora, lo que deseo es que el usuario al intentar guardar un archivo que actualmente trabaja en uns instancia de mi aplicación, y que intente sobreescribir un archivo que sea de otro tipo de extensión(.pdf,etc...), en el componente SaveFileDialog, no me permita hacerlo. Muestro el código que tengo implementado en el método Save.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
''' <summary>
''' Permite guardar en un archivo, la serialización de las instancias actuales de las Clases del proyecto
''' mediante el uso de la Función <remarks><seealso cref="Obtener_Clase_Serializar()/></remarks>,
''' la cual permite obtener la instancia actual de todas las clases del proyecto, en una sola clase contenedora.
''' </summary>
''' <param name="fs">Stream del archivo donde se guarda el estado actual de la aplicación.</param>
Private Sub Save(fs As FileStream)
'Verifico que el archivo Stream es Nothing.
'
If (fs Is Nothing) Then
'Esto indica, que aún no se ha bloqueado un archivo dentro de la varibale "stream"
'del formulario principal, lo cual puede darse porque o el usuario ha usado la opción
'Nuevo de la aplicación o simplemente ha abierto el programa desde el ejecutable, y
'en el constructor de la clase Form1, lo toma como si fuera un nuevo archivo.
'Validamos todos los datos en un Try, para evitar errores. Es casi el mismo método SaveAs
'más sin embargo existe un ligero cambio pues ya no se usa a comparación del método mencionado
'la línea de código Stream.Dispose(sino la suprimo,genererá una excepción que dice que no existe
'una instancia del objeto stream que liberar, es obvio, es Nothing).
'
Try
'Variable para obtener el nombre de la ruta del archivo donde desea
'guardar el archivo.
Dim fileName As String = String.Empty
'Creamos una nueva instancia de la clase SaveFileDialog
Using sfd As New SaveFileDialog()
sfd.DefaultExt = ".exa"
sfd.Filter = String.Format("Archivos del proyecto ({0})|*.{0}|Todos los archivos|*.*", sfd.DefaultExt)
'sfd.AddExtension = True ' El valor por defecto es True.
'Creo una variable de cuadro de dialogo, resutante del ShowDialog del SaveFileDailog.
Dim dr As DialogResult = sfd.ShowDialog()
'
'Verifico si el usuario ha presionado el botón Save o Guardar
If (dr = DialogResult.OK) Then
'Obtengo la ruta del archivo que intenta guardar en el SaveFileDialog
fileName = sfd.FileName
'
End If
End Using
'
If (fileName.Length > 0) Then
'
'Creamos una nueva secuencia de sólo escritura con el archivo seleccionado.
'Si el usuario reemplaza otro archivo, no generar ningún error.(FileMode.Create)
'
Using fs_nuevo As New FileStream(fileName, FileMode.Create, FileAccess.Write)
' Procedemos a serializar las clases.
Dim serializador As New Cl_Serializacion_Binaria()
'
'Se pasa al serializador el objeto actualizado y el stream donde se guardan los cambios.
serializador.Serialize(Obtener_Clase_Serializar, fs_nuevo)
'
End Using
'
'Bloque el archivo actual, para que sea exclusiva de la instancia actual de la aplicación.
'
stream = AbrirArchivo(fileName)
'
'Se cambia al formulario principal de la aplicación, el título, asignándole el nombre del
'archivo actual que se trabaja.
Me.Nombre_form_pcpal(fileName)
'
End If
Catch ex As System.IO.IOException
'
' Se ha producido un error en entrada/salida, incluyendo si
' ya existe un archivo con el mismo nombre.
XtraEditors.XtraMessageBox.Show(ex.Message, ex.GetType().FullName, MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
'
' Otros errores diferentes a IOException
XtraEditors.XtraMessageBox.Show(ex.Message, ex.GetType().FullName, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
'Caso contrario, ya la variable fs no es Nothing, lo cual indica que ya se ha usado
'y esto sucede cuando ya se ha guarado en disco un archivo, por ende el usuario lo
'que desea es actualizar el archivo con nuevos datos, es decir, guardar los cambios
'hechos.
Else
'Validamos todos los datos en un Try, para evitar errores.
'
Try
' Como nuestra intención es guardar los datos en la misma
' secuencia especificada (en el mismo archivo fs), tenemos que
' posicionarnos en el inicio de la secuencia(fs.Position) para que se
' sobrescriba todo su contenido.
'
fs.Position = 0
' Procedemos a serializar las clases.
Dim serializador As New Cl_Serializacion_Binaria()
serializador.Serialize(Me.Obtener_Clase_Serializar(), fs)
Catch ex As IOException
' Errores relacionados con entradas/salidas de secuencias.
MessageBox.Show(ex.Message, ex.GetType().FullName)
Catch ex As Exception
XtraEditors.XtraMessageBox.Show(ex.Message, ex.GetType().FullName, MessageBoxButtons.OK, MessageBoxIcon.Error)
MessageBox.Show("Ha ocurrido un error al intentar guardar los cambios en el archivo.", "Error en aplicación", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End If
End Sub
Espero me puedan ayudar. Muchas gracias.
Valora esta pregunta
0