PDA

Ver la Versión Completa : Error en OpenDialog


JoseFco
02-05-2008, 00:59:11
Hola Amigos.


begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;

Aqui se habre un OpenDialog y si seleciono un file y le doy open todo marcha como debe ser.Pero si decido cancelar entonces sale un error.
Como se puede evita que si decido cancelar no me de un error.? Que regrese normal al form sin una ventana de error.

Un Saludo.

egostar
02-05-2008, 01:11:23
Hola amigo [JoseFco], pues no le veo ningún problema a ese code, nos puedes mostrar que error es el que te sale?

Salud OS

JoseFco
02-05-2008, 01:20:08
Hola amigo [JoseFco], pues no le veo ningún problema a ese code, nos puedes mostrar que error es el que te sale?

Salud OS

Aqui esta la ventana (http://suncoastmicros.com/images/error.gif) que me sale. Esto si decido cancelar el opendialog.

Un Saludo.

eduarcol
02-05-2008, 01:27:11
antes de abrir el archivo agrega esto:

if FileExists(Edit1.Text) then
//Abrir el archivo

JoseFco
02-05-2008, 01:35:05
antes de abrir el archivo agrega esto:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)if FileExists(Edit1.Text) then
//Abrir el archivo






procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
with TStringList.Create do
try
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;

No veo donde intercalar esa linea eduarcol.

Un Saludo.

eduarcol
02-05-2008, 01:49:42
debes agregar sysutils al uses



procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
with TStringList.Create do
try
if FileExists(Edit1.Text) then
begin
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;
end;

JoseFco
02-05-2008, 02:00:46
Caso resuelto maestro..:)

roman
02-05-2008, 02:31:31
Disculpen, pero aunque el FileExists evita el problema, lo que sucede aquí es que se está mandando abrir el archivo aun cuando el usuario haya cancelado la operación. Lo lógico sería:


if OpenDialog1.Execute then
begin

...

LoadFromFile(OpenDialog1.FileName);

...

end;


De esta manera evitamos preguntar por la existencia de un archivo que de antemano sabemos que no existe cuando el usuario cancela el diálogo.

// Saludos

JoseFco
02-05-2008, 02:54:31
Disculpen, pero aunque el FileExists evita el problema, lo que sucede aquí es que se está mandando abrir el archivo aun cuando el usuario haya cancelado la operación. Lo lógico sería:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
if OpenDialog1.Execute then
begin

...

LoadFromFile(OpenDialog1.FileName);

...

end;





De esta manera evitamos preguntar por la existencia de un archivo que de antemano sabemos que no existe cuando el usuario cancela el diálogo.

// Saludos

Hola roman.

Lo tengo asi exactamente como lo puso eduarcol y aun cuando seleciono el file.Si decido en vez de "Open" poner "Cancel" el file no entra al buffer ni me pone en el edit que tengo como "Load File" nada. El error que tenia anteriormente desaparecio.No me sale mas la ventana.
Me gustaria entender mejor lo que me explicas ya que me perdi en los puntitos esos.

Un Saludo.

Delphius
02-05-2008, 03:22:45
Hola roman.

Lo tengo asi exactamente como lo puso eduarcol y aun cuando seleciono el file.Si decido en vez de "Open" poner "Cancel" el file no entra al buffer ni me pone en el edit que tengo como "Load File" nada. El error que tenia anteriormente desaparecio.No me sale mas la ventana.
Me gustaria entender mejor lo que me explicas ya que me perdi en los puntitos esos.

Un Saludo.
Lo que dice roman es que no se necesita de un FileExist si lo estamos buscando y suministrando.

Al hacer un:


if OpenDialog1.Execute
then begin
// todo lo que hay que hacer
end;


Garantizamos de que en el TEdit quede la ruta del archivo.

Mientras que si se hace:


if OpenDialog1.Execute
then Edit1.Text := OpenDialog1.FileName;

// lo que hay que hacer
LoadFromFile(Edit1.Text);
// Sigamos haciendo algo...


Dejamos la posibilidad de que en el TEdit quede un valor inconsistente ante una operación Cancel ya que se está leyendo el valor independientemente de si se validó o se canceló.

La forma correcta es como señala roman: todo el código debe ir en la parte then:


if OpenDialog1.Execute
then begin
// lo que haya que hacer...
// No hace falta preguntar si existe...
LoadFromFile(Edit1.Text);
// algo más para hacer...
end;


¿Se vé la diferencia?
Espero que se me entienda. Si no lo vuelvo explicar.

Saludos,

egostar
02-05-2008, 03:23:20
Hola roman.

Lo tengo asi exactamente como lo puso eduarcol y aun cuando seleciono el file.Si decido en vez de "Open" poner "Cancel" el file no entra al buffer ni me pone en el edit que tengo como "Load File" nada. El error que tenia anteriormente desaparecio.No me sale mas la ventana.
Me gustaria entender mejor lo que me explicas ya que me perdi en los puntitos esos.

Un Saludo.

Lo que apunta roman es que "metiendo" en un solo bloque begin...end todo el código no es necesario validar si existe el archivo ya que en el momento que eliges cancel el método execute será false por lo tanto no ejecutará nada.

Salud OS

roman
02-05-2008, 03:34:26
Ya lo explicaron muy bien Delphius y egostar. La solución del FileExists sí resuelve el problema, pero es como tapar el pozo después del niño ahogado :D Mejor evitar que se ahogue el niño.

De todas formas, por lo general conviene poner la opción ofFileMustExists al diálogo para evitar que el usuario escriba cualquier cosa en el diálogo y oprima aceptar.

// Saludos

JoseFco
02-05-2008, 04:07:10
Este es mi codigo original:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura

with TStringList.Create do
try
if FileExists(Edit1.Text) then
begin
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;
end;
//***************************************************************

begin
indice := 0; //Suponiendo que buffer sea un array de 1...x
for i := 1 to 255 do begin //2 renglones, cambialo a los renglones que esperas
for j := 1 to 16 do begin //15 columnas
stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
inc(indice);
end;
end;
end;
//***************************************************************
Str:= Str + #32 + IntToHex(Buffer[i],2);
if ((i+1) mod 16 = 0) then
begin
Memo1.Lines.Add(Str);
Str:= EmptyStr;
end;

if Str <> EmptyStr then
Memo1.Lines.Add(Str);
finally
Free;
end;
end;

Si lo corro asi y al final decido no bajar el file me da el error.Entiendo lo que dice roman pero en este procedimiento hago varias cosas y no entiendo a donde mover esa parte del codigo.

Un Saludo.

eduarcol
02-05-2008, 04:11:23
Ya lo explicaron muy bien Delphius y egostar. La solución del FileExists sí resuelve el problema, pero es como tapar el pozo después del niño ahogado :D Mejor evitar que se ahogue el niño.

De todas formas, por lo general conviene poner la opción ofFileMustExists al diálogo para evitar que el usuario escriba cualquier cosa en el diálogo y oprima aceptar.

// Saludos

Momento que no he ahogado a ningun niño :D:D

al momento solo tenia esta información:

if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;

y como lo dijo Eliseo eso esta bien, lo unico que se me ocurrio es que en algun momento el nombre del archivo cambiaba antes de abrirlo por eso propuse que lo buscara. Ademas no le veo lo malo, es solo comprobar si existe o cambio ;)

egostar
02-05-2008, 04:17:11
A ver amigo [JoseFco], seguro que esto compila??????


procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then begin
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
with TStringList.Create do
try
if FileExists(Edit1.Text) then begin
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;
end;
//***************************************************************
begin
indice := 0; //Suponiendo que buffer sea un array de 1...x
for i := 1 to 255 do begin //2 renglones, cambialo a los renglones que esperas
for j := 1 to 16 do begin //15 columnas
stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
inc(indice);
end;
end;
end; //Este bloque que onda, porque entre un begin....end;
//***************************************************************
Str:= Str + #32 + IntToHex(Buffer[i],2);
if ((i+1) mod 16 = 0) then begin
Memo1.Lines.Add(Str);
Str:= EmptyStr;
end;
if Str <> EmptyStr then
Memo1.Lines.Add(Str);
finally
Free;
end;
end;
end; //Falta un end;


Salud OS

Delphius
02-05-2008, 04:22:29
Yo también me pregunto si compila...

Lo que está marcado con rojo es el problema.

Saludos,

JoseFco
02-05-2008, 04:26:16
Asi esta y no solo copila, trabaja bien:


procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura

with TStringList.Create do
try
if FileExists(Edit1.Text) then
begin
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;
end;
//***************************************************************

begin
indice := 0; //Suponiendo que buffer sea un array de 1...x
for i := 1 to 255 do begin //2 renglones, cambialo a los renglones que esperas
for j := 1 to 16 do begin //15 columnas
stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
inc(indice);
end;
end;
end;
//***************************************************************
Str:= Str + #32 + IntToHex(Buffer[i],2);
if ((i+1) mod 16 = 0) then
begin
Memo1.Lines.Add(Str);
Str:= EmptyStr;
end;

if Str <> EmptyStr then
Memo1.Lines.Add(Str);
finally
Free;
end;
end;


Asi esta y en mi delphis no me pide mas end alguno.

Un Saludo.
PD: existen algunas declaraciones que estan globales puede que por eso no te copile a ti.

JoseFco
02-05-2008, 04:30:41
Aqui va el relajo completo:


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CPort, StdCtrls, ComCtrls, Grids, Menus, Mask, Buttons;
//Aqui declaramos el Tipo BUFFER
type
TBuffer = array[$0000..$FFFF] of Byte;
type
TForm1 = class(TForm)
ComPort: TComPort;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
Label2: TLabel;
Label3: TLabel;
StringGrid1: TStringGrid;
Button4: TButton;
MainMenu1: TMainMenu;
Archivo1: TMenuItem;
Puerto1: TMenuItem;
StaticText1: TStaticText;
Edit1: TEdit;
GroupBox1: TGroupBox;
ProgressBar1: TProgressBar;
GroupBox2: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
Edit2: TEdit;
Edit3: TEdit;
StaticText2: TStaticText;
StaticText3: TStaticText;
Edit4: TEdit;
StaticText4: TStaticText;
DEVICE1: TMenuItem;
AT89S511: TMenuItem;
AT89S521: TMenuItem;
About1: TMenuItem;
Edit5: TEdit;
StaticText5: TStaticText;
procedure FormCreate(Sender: TObject);
procedure ComPortRxChar(Sender: TObject; Count: Integer);
procedure Memo1Change(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Puerto1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure AT89S511Click(Sender: TObject);
procedure AT89S521Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
procedure InicializaGridBuffer;
public
{ Public declarations }
end;
const
BufferSize = 4096;
var
Form1: TForm1;
Cuantos, CuentaB : Integer;
Contador, ByteCnt : Integer;
LineaMemo : String;
Count : Integer;
//Aqui declaramos la variable BUFFER para que funcione a forma global
Buffer: TBuffer;
//Aqui declaramos otra variable de tipo BUFFER para recibir
BuffReceptor: TBuffer;
implementation

{$R *.dfm}
function Insertar(Str: String; var Buffer: TBuffer): String;
var
i,j,k: Integer;
begin
Result:= EmptyStr;
Str:= Trim(Str);
if Copy(Str,1,1) = ':' then
if TryStrToInt('$' + Copy(Str,2,2),i) then
if Length(Str) = ((2*i) + 11) then
if TryStrToInt('$' + Copy(Str,4,4),j) then
if TryStrToInt('$' + Copy(Str,8,2),k) then
if k = 0 then
begin
Str:= Copy(Str,10,2*i);
for k:= j to (j + i - 1) do
begin
Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
Delete(Str,1,2);
end;
end;
end;
procedure TForm1.InicializaGridBuffer;
var
i,r,j,k,l: integer;
begin
StringGrid1.ColWidths[0] := 35;
StringGrid1.Cells[0,0] := 'Addr';
for i := 0 to 15 do
StringGrid1.Cells[i+1,0] := IntTohex(i,2);
for j := 0 to (BufferSize div 16)-1 do // (BufferSize div 16)
begin
k := j;
StringGrid1.Height := StringGrid1.Height + 1;
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cells[0,k+1] := IntToHex(l,4);
l := l + 16;
for r := 1 to 16 do
StringGrid1.Cells[r,k+1] := IntToHex(255,2);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if not ComPort.Connected then
ComPort.Open;
Comport.WriteStr(#2#0);
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort.ReadStr(Str, Count);
if Str= 'Hi-LOGIC' then
Edit2.Text:=('Programmer detected........OK !')
else if Str = #1 then
begin
case Cuantos of
1: begin //poner el chip en prog..
ComPort.WriteStr(#2#2);
Cuantos := 2;
end;
2: begin //comando para borrar.
ComPort.WriteStr(#2#3);
Cuantos := 3;
end;
3: begin //Modo Borrar
sleep(500);
Edit2.Text:=('Chip Erasing....... OK!')
end;
4: begin //poner el chip en prog..
ComPort.WriteStr(#2#2);
Cuantos := 5;
end;
5: begin // Comando para escribir el chip(06 04 00 00 10 00)
ComPort.WriteStr(#6#4#0#0#16#0);

ComPort.Write(Buffer[0],1);
Contador := 1;
end;
6: begin //poner el chip en prog..
ComPort.WriteStr(#2#2);
Cuantos := 7;
end;
7: begin // Comando para leer el chip(06 05 00 00 10 00)
ComPort.WriteStr(#6#5#0#0#16#0);
// ya aqui estaria recibiendo los 4096 bytes de data
end;
end;
end
else if Str = #2 then
begin
//
end
else if Str = #83 then
begin
if contador <= 4095 then
begin
ComPort.Write(Buffer[Contador],1);
ProgressBar1.Position := Contador;
Inc(Contador);
Edit5.Text := IntToStr(Contador);
end
else if contador = 4096 then
Edit2.Text:=('Flash Programmed........OK !')
end
else if (cuantos = 7) then
begin
BuffReceptor[CuentaB] := StrToInt(Str);
Inc(CuentaB);
if (CuentaB >= 4096) AND (Cuantos = 7) then
begin
cuantos := 0;
ShowMessage('Lectura de Chip terminada');
end ;
end;
end;
//Aqui comienza el procedimiento para borrar el chip
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if not ComPort.Connected then
ComPort.Open;
Comport.WriteStr(#4#1#0#1);
Edit2.Text:=('>>>>>> >>>>>> >>>>>> >>>>>> >>>>>');
Cuantos := 1;
end;
//Aqui comienza el procedimiento para escribir el chip
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
if not ComPort.Connected then
ComPort.Open;
Comport.WriteStr(#4#1#0#1);
Cuantos := 4;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,indice: integer;
Str: String;
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
Edit2.Text:=('Load File..................OK !');
Memo1.Clear;
//Inicializo las columnas y filas de el stringgrid donde se inicia la escritura

with TStringList.Create do
try
if FileExists(Edit1.Text) then
begin
LoadFromFile(Edit1.Text);
FillChar(Buffer,Sizeof(Buffer),#255);
for i:= 0 to Count - 1 do
Insertar(Strings[i],Buffer);
j:= StrToInt(Label2.caption);
Str:= EmptyStr;
end;
//***************************************************************

begin
indice := 0; //Suponiendo que buffer sea un array de 1...x
for i := 1 to 255 do begin //2 renglones, cambialo a los renglones que esperas
for j := 1 to 16 do begin //15 columnas
stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
inc(indice);
end;
end;
end;
//***************************************************************
Str:= Str + #32 + IntToHex(Buffer[i],2);
if ((i+1) mod 16 = 0) then
begin
Memo1.Lines.Add(Str);
Str:= EmptyStr;
end;

if Str <> EmptyStr then
Memo1.Lines.Add(Str);
finally
Free;
end;
end;
//Este procedimiento limita a 26 caracteres las lineas del memo
procedure TForm1.Memo1Change(Sender: TObject);
begin
if (Length(Memo1.Lines.Text) mod 26) = 0 then
begin
Memo1.Lines.Add(''); //nueva linea
Memo1.SelStart := Length(Memo1.Lines.Text); //mover cursor
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
InicializaGridBuffer;
CuentaB := 0;
end;

procedure TForm1.Puerto1Click(Sender: TObject);
begin
ComPort.ShowSetupDialog ;
end;
procedure TForm1.AT89S511Click(Sender: TObject);
begin
Edit3.Text:=('AT89S51');
Edit4.Text:=('4096');
end;
procedure TForm1.AT89S521Click(Sender: TObject);
begin
Edit3.Text:=('AT89S52');
Edit4.Text:=('8192');
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
if not ComPort.Connected then
ComPort.Open;
Comport.WriteStr(#4#1#0#1);
Cuantos := 6;
end;
end.


Lo que decia son las declaraciones globales las que no los deja copilar.

Un Saludo.

roman
02-05-2008, 04:38:09
Amigo José Francisco, yo te propongo, antes que nada, que revises con cuidado las indentaciones de tu código. Tal como las tienes lo hace casi ilegible. Por ejemplo, en el procedimiento que nos ocupa hay un bloque begin..end con cero indentación cuando debería estarlo. Hay ciclos for al que le siguen varias líneas indentadas pero no están encerradas en un bloque begin..end. Lo mismo con las líneas que siguen al if del OpenDialog.

Tal como está no esposible discernir si esas líneas tenías la intención de pertenecer a un mismo bloque o no y dificulta el anaálisis del código.

// Saludos

JoseFco
02-05-2008, 04:45:50
Amigo José Francisco, yo te propongo, antes que nada, que revises con cuidado las indentaciones de tu código. Tal como las tienes lo hace casi ilegible. Por ejemplo, en el procedimiento que nos ocupa hay un bloque begin..end con cero indentación cuando debería estarlo. Hay ciclos for al que le siguen varias líneas indentadas pero no están encerradas en un bloque begin..end. Lo mismo con las líneas que siguen al if del OpenDialog.

Tal como está no esposible discernir si esas líneas tenías la intención de pertenecer a un mismo bloque o no y dificulta el anaálisis del código.

// Saludos

Es parte de la novatada, imagino los errores que tendra el codigo, es mi primer programita en Delphi. Y comence por algo grande para uno que apenas entiende algunas cositas.
Me falta mucho que aprender de ustedes.
Un Saludo.

roman
02-05-2008, 04:56:10
Pues bueno, esperamos entonces la corrección de la indentación. No creo que sea necesario poner tooooodo el código, basta la del botón que abre el archivo.

Pero regresando al punto original, creo que para entenderlo conviene que te olvides por un momento del código y te centres en la lógica del asunto.

Si no mal entiendo, tienes un botón para abrir un archivo y procesar dicho archivo. La lógica lo que dice es que, si no abres el archivo, entonces no haces nada. Por eso, en pseudo código:


IF AbreArchivo THEN
BEGIN
ProcesoArchivo
END


En ProcesoArchivo va todo lo que debes hacer cuando abres el archivo, incluída la construcción del StringList.

Lo que ahora tienes (otra vez en pseudo código) es


AbreArchivo

IF ExisteElArchivo THEN
BEGIN
ProcesaArchivo
END


Es decir, realmente (aunque tienes un if por delante) no estás tomando o no una acción dependiendo del resultado de Execute, sino que indistintamente seguías con el proceso. Lo solventaste con el FileExists, pero no había que llegar a eso, porque la cuestión es:

Si no abres el archivo entoncs no haces nada.

// Saludos