Estoy escribiendo un MFC C++ aplicación que tiene un botón Guardar Como para guardar un .txt archivo en el disco. Con esto estoy tratando de añadir un extra de verificación para la sobreescritura de archivos (si un archivo con el mismo nombre existe, entonces debe consultar al usuario si quiere sobrescribir el archivo antiguo o no). He intentado esto con el código de abajo, pero en realidad no funciona. Cuando hago clic en No en el cuadro de mensaje, se debe reabrir el Guardar Como cuadro de diálogo de archivo, pero en lugar de eso me da dos errores: el primero es Debug assertion failed, y la segunda es Encountered an improper argument. ¿Cómo debo hacer las cosas mejor? Este es el código:

char strFilter[] = { "Text Files (*.txt)|*.txt|" }; 

    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 

    while(true)
    {
        if( FileDlg.DoModal() == IDOK ) //this is the line which gives the errors
        {
            agendaName = FileDlg.GetFileName(); //filename
            agendaPath = FileDlg.GetFolderPath(); //filepath (folders)

            if(model->agendaExists(CSToString(agendaPath+TEXT("\")+agendaName))) //there is another file called the same way
            {
                if(MessageBox(TEXT("A file with the specified name already exists. Overwrite?"), TEXT("File exists"), MB_YESNO) != 6) //user clicked NO (do not overwrite file)
                {
                    continue;
                }

            }

            model->sendToFile(CSToString(agendaPath+TEXT("\")+agendaName));  //the file is unique so the agenda named agendaName found at path agendaPath is saved
            return;
        }
    }

Cabe mencionar que los errores se producen en la línea 7, y sólo en el segundo bucle a través de la while.

OriginalEl autor Adrian Marinica | 2011-05-12

3 Comentarios

  1. 8

    CFileDialog puede detectar si un archivo existe y pedir al usuario para sobrescribir.

    explicit CFileDialog(
       BOOL bOpenFileDialog,
       LPCTSTR lpszDefExt = NULL,
       LPCTSTR lpszFileName = NULL,
       DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
       LPCTSTR lpszFilter = NULL,
       CWnd* pParentWnd = NULL,
       DWORD dwSize = 0
    );

    Acaba de pasar OFN_OVERWRITEPROMPT de las banderas.

    Como para su problema, ejecute en el Depurador y cuando usted consigue que la afirmación presione el botón Reintentar para ver dónde está el problema viene (probablemente usted tendrá que mirar a través de la pila de llamadas también). Tal vez usted debe tratar de poner esto en el bucle while:

    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter)); 

    OriginalEl autor Marius Bancila

  2. 3

    Debe utilizar el OFN_OVERWRITEPROMPT bandera en el constructor. Esa bandera es generalmente uno de los indicadores predeterminados, pero tienen que poner sus banderas a 0. Por lo tanto, si usted:

    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, CString(strFilter));
    
    if (FileDlg.DoModal() == IDOK)  
    {  
        model->sendToFile(CSToString(FileDlg.GetPathName()));
    }

    Se debe trabajar. Por el camino, GetPathName() obtiene la ruta de acceso completa al archivo seleccionado, así que usted no necesita obtener la carpeta y el nombre del archivo en 2 pasos.

    Lo sé, pero necesito el nombre de archivo y la ruta de acceso del archivo. Como para el de arriba, funcionó. Gracias!

    OriginalEl autor MikMik

  3. 1

    Intentar incluyendo debajo de la línea dentro del bucle while (como primera línea en el bucle while)

    CFileDialog FileDlg(FALSE, CString(".txt"), NULL, 0, CString(strFilter));

    Esta línea está fuera del bucle while en el código

    OriginalEl autor Ankur

Dejar respuesta

Please enter your comment!
Please enter your name here