Вы можете использовать следующий код, чтобы проверить, может ли файл быть открыт с эксклюзивным доступом (то есть он не открывается другим приложением). Если файл не закрыт, вы можете подождать несколько секунд и снова проверить, пока файл не будет закрыт, и вы можете его скопировать.
Вы все равно должны проверить, не сработал ли File.Copy, поскольку другое приложение может откройте файл с момента проверки файла и момента его копирования.
public static bool IsFileClosed(string filename)
{
try
{
using (var inputStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None))
{
return true;
}
}
catch (IOException)
{
return false;
}
}
Другой метод, очень полезный:
try
{
...
}
catch (Exception e)
{
Log.e(APP_TAG, "STACKTRACE");
Log.e(APP_TAG, Log.getStackTraceString(e));
}
В Android вы должны использовать методы журнала, которые хорошо работают с программой просмотра журнала Logcat, используемой Android.
} catch (IOException e) {
Log.e("YOUR ERROR TAG HERE", "Copying failed", e);
}
Используя метод Log.e, который принимает в качестве аргумента метод throwable, вы убедитесь, что класс журнала возьмет трассировку стека и правильно зарегистрирует ее в Logcat. Если вы используете e.printStackTrace, для этого будут использоваться общие методы ведения журнала Java, и он не будет отображаться правильно в Logcat, а в некоторых случаях будет невозможно дважды щелкнуть имя класса в logcat, чтобы перейти к классу и методу, упомянутым в StackTrace.
Печать Stacktrace для деления на ноль будет выглядеть следующим образом:
11-21 20:55:47.360: W/System.err(989): java.lang.ArithmeticException: divide by zero
11-21 20:55:47.379: W/System.err(989): at test.tabs.TabChooser.onCreate(TabChooser.java:15)
11-21 20:55:47.390: W/System.err(989): at android.app.Activity.performCreate(Activity.java:4465)
11-21 20:55:47.410: W/System.err(989): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-21 20:55:47.410: W/System.err(989): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-21 20:55:47.420: W/System.err(989): at android.os.Handler.dispatchMessage(Handler.java:99)
11-21 20:55:47.420: W/System.err(989): at android.os.Looper.loop(Looper.java:137)
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.main(ActivityThread.java:4340)
11-21 20:55:47.430: W/System.err(989): at java.lang.reflect.Method.invokeNative(Native Method)
11-21 20:55:47.430: W/System.err(989): at java.lang.reflect.Method.invoke(Method.java:511)
11-21 20:55:47.430: W/System.err(989): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-21 20:55:47.430: W/System.err(989): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-21 20:55:47.430: W/System.err(989): at dalvik.system.NativeStart.main(Native Method)
Исключение регистрируется как предупреждение, и тег журнала не очень полезен.
Правильная регистрация деления на ноль будет выглядеть следующим образом:
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): Copying failed
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): java.lang.ArithmeticException: divide by zero
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at test.tabs.TabChooser.onCreate(TabChooser.java:16)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.Activity.performCreate(Activity.java:4465)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.os.Handler.dispatchMessage(Handler.java:99)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.os.Looper.loop(Looper.java:137)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.main(ActivityThread.java:4340)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at java.lang.reflect.Method.invokeNative(Native Method)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at java.lang.reflect.Method.invoke(Method.java:511)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at dalvik.system.NativeStart.main(Native Method)
Исключение правильно регистрируется как ошибка с вашим тегом журнала и сообщением журнала.
} catch (IOException e) {
e.printStackTrace();
}