使用它完成应用程序时释放文件

时间:2016-11-20 22:00:15

标签: c# .net winforms printing release

我正在使用 List<string> DocPathList = new List<string>(); private int page; private void btn_Print_Click(object sender, EventArgs e) { DirectoryInfo SourceDirectory = new DirectoryInfo(@"C:\image\Shared_Directory\Printing_Folder\"); FileInfo[] Files = SourceDirectory.GetFiles("*.tif"); //Getting Tif files foreach (FileInfo file in Files) { DocPathList.Add(SourceDirectory + file.Name); } printPreviewDialog1.Document = printDocument1; printPreviewDialog1.Show(); } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { e.Graphics.DrawImage(Image.FromFile(DocPathList[page]), e.MarginBounds); page++; e.HasMorePages = page < DocPathList.Count; } private void printDocument1_BeginPrint(object sender, PrintEventArgs e) { page = 0; } 。在我的表单中,我有一个按钮,可以在目录中打印所有tif图像。我想告诉我的应用程序在取消打印作业或完成打印时释放图像。我认为FileInfo可能是这里的问题。我怎样才能完成这项任务?

printPreviewDialog1.Show();

如果我添加这行代码,它会释放图像。如果我点击按钮一次就可以了。但是,如果我想第二次按下打印按钮 using (var image = Image.FromFile(DocPathList[page])) { e.Graphics.DrawImage(image, e.MarginBounds); page++; e.HasMorePages = page < DocPathList.Count; } 则会抛出错误:

  

抛出异常:&#39; System.ObjectDisposedException&#39;在System.Windows.Forms.dll

 $ g++ -o build/server/auction_manager.o -c -g -v -MMD -I src -I include -I /usr/local/include/odb -I /usr/local/Cellar/protobuf/3.1.0/include -D ENABLE_TRACE_LOGGING -D AUCTION_APP__ENABLE_ODB -std=c++11 src/server/auction_manager.cpp
Using built-in specs.
COLLECT_GCC=g++-4.8
Target: x86_64-apple-darwin15.4.0
Configured with: ../configure --build=x86_64-apple-darwin15.4.0 --prefix=/usr/local/Cellar/gcc48/4.8.5 --libdir=/usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-4.8 --with-gmp=/usr/local/opt/gmp4 --with-mpfr=/usr/local/opt/mpfr2 --with-mpc=/usr/local/opt/libmpc08 --with-cloog=/usr/local/opt/cloog018 --with-isl=/usr/local/opt/isl011 --with-system-zlib --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --with-pkgversion='Homebrew gcc48 4.8.5' --with-bugurl=https://github.com/Homebrew/homebrew-versions/issues --with-build-config=bootstrap-debug --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.8.5 (Homebrew gcc48 4.8.5) 
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.11.6' '-o' 'build/server/auction_manager.o' '-c' '-g' '-v' '-MMD' '-I' 'src' '-I' 'include' '-I' '/usr/local/include/odb' '-I' '/usr/local/Cellar/protobuf/3.1.0/include' '-D' 'ENABLE_TRACE_LOGGING' '-D' 'AUCTION_APP__ENABLE_ODB' '-std=c++11' '-shared-libgcc' '-mtune=core2'
 /usr/local/Cellar/gcc48/4.8.5/libexec/gcc/x86_64-apple-darwin15.4.0/4.8.5/cc1plus -quiet -v -I src -I include -I /usr/local/include/odb -I /usr/local/Cellar/protobuf/3.1.0/include -MMD build/server/auction_manager.d -MQ build/server/auction_manager.o -D__DYNAMIC__ -D ENABLE_TRACE_LOGGING -D AUCTION_APP__ENABLE_ODB src/server/auction_manager.cpp -fPIC -feliminate-unused-debug-symbols -quiet -dumpbase auction_manager.cpp -mmacosx-version-min=10.11.6 -mtune=core2 -auxbase-strip build/server/auction_manager.o -g -std=c++11 -version -o /var/folders/pq/7_55zz516wj21251nl6qmfxc0000gn/T//ccjIc5CR.s
GNU C++ (Homebrew gcc48 4.8.5) version 4.8.5 (x86_64-apple-darwin15.4.0)
    compiled by GNU C version 4.8.5, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/../../../../../../x86_64-apple-darwin15.4.0/include"
#include "..." search starts here:
#include <...> search starts here:
 src
 include
 /usr/local/include/odb
 /usr/local/Cellar/protobuf/3.1.0/include
 /usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/../../../../../../include/c++/4.8.5
 /usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/../../../../../../include/c++/4.8.5/x86_64-apple-darwin15.4.0
 /usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/../../../../../../include/c++/4.8.5/backward
 /usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/include
 /usr/local/include
 /usr/local/Cellar/gcc48/4.8.5/include
 /usr/local/Cellar/gcc48/4.8.5/lib/gcc/4.8/gcc/x86_64-apple-darwin15.4.0/4.8.5/include-fixed
 /usr/include
 /System/Library/Frameworks
 /Library/Frameworks
End of search list.
GNU C++ (Homebrew gcc48 4.8.5) version 4.8.5 (x86_64-apple-darwin15.4.0)
    compiled by GNU C version 4.8.5, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: b331b823481e84001cac67f078515d00
In file included from src/server/auction_manager.cpp:16:0:
src/query/account-odb.hpp:17:2: error: #error ODB runtime version mismatch
 #error ODB runtime version mismatch
  ^
In file included from src/server/auction_manager.cpp:17:0:
src/query/auction-odb.hpp:17:2: error: #error ODB runtime version mismatch
 #error ODB runtime version mismatch
  ^
In file included from src/query/auction-odb.hpp:25:0,
                 from src/server/auction_manager.cpp:17:
src/query/bid-odb.hpp:17:2: error: #error ODB runtime version mismatch
 #error ODB runtime version mismatch

例如,如果我取消我的打印然后转到文件浏览以删除/重命名/修改此文件我将在下面的错误。 目前我必须关闭我的应用程序然后我可以修改tif文件。

enter image description here

2 个答案:

答案 0 :(得分:1)

在任何情况下,您都需要将image封装在编辑中描述的using块中,因为Image.FromFile()keep a lock on the file until the image is disposed。< / p>

您看到的ObjectDisposedException来自printPreviewDialog,与加载图片无关。你可以......

(a)使用printPreviewDialog1.ShowDialog(this)代替以模态方式显示对话框(即,在对话框打开时阻止输入到父窗口),在关闭对话框后不会对其进行处理

或,(b)使用printPreviewDialog.Show(this)以非模态方式显示对话框,就像现在一样,但添加以下回调:

    private void printPreviewDialog1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Don't close and dispose the form if the user is just dismissing it. Hide instead.
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            printPreviewDialog1.Hide();
        }
    }

答案 1 :(得分:0)

订阅EndPrint Event并删除那里的文件?

来自文档:

  

如果取消打印过程,也会发生EndPrint事件   在打印过程中发生异常。